Files
Mozilla/mozilla/cmd/xfe/src/EditorDrop.cpp
ltabb 8ed5afe62c Free the lizard
git-svn-id: svn://10.0.0.236/trunk@10 18797224-902f-48f8-a5cc-f745e15eee43
1998-03-28 02:44:41 +00:00

218 lines
6.0 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
EditorDrop.cpp -- class definition for the editor drop class
Created: Alastair Gourlay <sgidev@netscape.com>, 1-Jan-96.
*/
#include "EditorDrop.h"
#include "xeditor.h"
#include "edt.h"
#if defined(DEBUG_sgidev) || defined(DEBUG_djw)
#define XDEBUG(x) x
#else
#define XDEBUG(x)
#endif
//
// XFE_EditorDrop class
//
// constructor
XFE_EditorDrop::XFE_EditorDrop(Widget parent,XFE_EditorView *editorView)
: XFE_DropNetscape(parent)
{
_editorView=editorView;
}
XFE_EditorDrop::~XFE_EditorDrop()
{
}
void XFE_EditorDrop::targets()
{
_numTargets=2;
_targets=new Atom[_numTargets];
_targets[0]=_XA_NETSCAPE_URL;
_targets[1]=XA_STRING;
acceptFileTargets();
}
void XFE_EditorDrop::operations()
{
// always copy - move/link irrelevant
_operations=(unsigned int)XmDROP_COPY;
}
Atom XFE_EditorDrop::acceptDrop(unsigned int dropOperation,Atom *dropTargets,unsigned int numDropTargets)
{
// reject a drag from the same browser window
if (XFE_DragBase::_activeDragShell) {
Widget shell=_widget;
while (!XtIsShell(shell)) shell=XtParent(shell);
if (shell==XFE_DragBase::_activeDragShell)
return None;
}
// continue with regular target selection
return XFE_DropNetscape::acceptDrop(dropOperation,dropTargets,numDropTargets);
}
int XFE_EditorDrop::processTargets(Atom *targets,const char **data,int numItems)
{
if (!targets || !data || numItems==0)
return FALSE;
// process dropped files/documents
int anySuccess=FALSE;
for (int i=0;i<numItems;i++) {
if (targets[i]==None || data[i]==NULL || strlen(data[i])==0)
continue;
// a file is just a file.. (XFE_DropNetscape parse any NetscapeURL
// or WebJumper shortcut files in _NETSCAPE_URL)
if (targets[i]==_XA_FILE_NAME) {
anySuccess |= insertFile(data[i]);
}
// a link is just a link, unless it's a file: url, in which case
// lets import it as a file. This covers local files, viewed in
// Navigator, then dragged to the Editor.
else if (targets[i]==_XA_NETSCAPE_URL) {
XFE_URLDesktopType urlData(data[i]);
for (int j=0;j<urlData.numItems();j++) {
if (XP_STRNCASECMP(urlData.url(j),"file:",5)==0) {
anySuccess |= insertFile(urlData.url(j)+5);
}
else {
anySuccess |= insertLink(urlData.url(j));
}
}
}
// A string is just a string, unless it's a URL, which is just
// a URL, unless it's a file: url. See above for thrilling details.
else if (targets[i]==XA_STRING) {
if (NET_URL_Type(data[i])!=0) {
if (XP_STRNCASECMP(data[i],"file:",5)==0) {
anySuccess |= insertFile(data[i]+5);
}
else {
anySuccess |= insertLink(data[i]);
}
}
else {
anySuccess |= insertText(data[i]);
}
}
}
// if any of the dropped items succeeded, let's celebrate.
return anySuccess;
}
int XFE_EditorDrop::insertLink(const char *data)
{
XDEBUG(printf("XFE_EditorDrop:insertLink(%s) at (%d,%d)\n",
data,_dropEventX,_dropEventY));
MWContext* context = _editorView->getContext();
int32 x = _dropEventX + CONTEXT_DATA(context)->document_x;
int32 y = _dropEventY + CONTEXT_DATA(context)->document_y;
EDT_PositionCaret(context, x, y);
fe_EditorHrefInsert(context, NULL, (char*)data);
return TRUE;
}
int XFE_EditorDrop::insertFile(const char *data)
{
XDEBUG(printf("XFE_EditorDrop:insertFile(%s) at (%d,%d)\n",
data,_dropEventX,_dropEventY));
const char *dataType=XFE_DragBase::guessUrlMimeType(data);
MWContext* context = _editorView->getContext();
if (XP_STRCASECMP(dataType,"image/gif") == 0
||
XP_STRCASECMP(dataType,"image/jpeg") == 0) {
XDEBUG(printf(" GIF/JPG Image\n"));
EDT_ImageData* image;
char buf[1024];
if (data[0] == '/' && data[1] != '/') { // local file name, url-ise it
XP_STRCPY(buf, "file://");
XP_STRNCAT_SAFE(buf, data, sizeof(buf) - 7/*sizeof("file://")*/);
data = buf;
}
int32 x = _dropEventX + CONTEXT_DATA(context)->document_x;
int32 y = _dropEventY + CONTEXT_DATA(context)->document_y;
EDT_PositionCaret(context, x, y);
image = EDT_NewImageData();
image->pSrc = XP_STRDUP((char*)data); //need heap for EDT_FreeImageData
image->bNoSave = FALSE; // copy to be with file.
EDT_InsertImage(context, image, FALSE);
EDT_FreeImageData(image);
return TRUE;
} else {
fe_EditorEdit(context, (XFE_Frame*)_editorView->getToplevel(),
/*chromespec=*/NULL, (char*)data);
return TRUE;
}
}
int XFE_EditorDrop::insertText(const char *data)
{
XDEBUG(printf("XFE_EditorDrop:insertText(%s) at (%d,%d)\n",
data,_dropEventX,_dropEventY));
MWContext* context = _editorView->getContext();
int32 x = _dropEventX + CONTEXT_DATA(context)->document_x;
int32 y = _dropEventY + CONTEXT_DATA(context)->document_y;
EDT_PositionCaret(context, x, y);
EDT_ClipboardResult result = EDT_PasteText(context, (char*)data);
if (result != EDT_COP_OK) {
XBell(XtDisplay(CONTEXT_WIDGET(context)), 0);
return FALSE;
}
return TRUE;
}