Files
Mozilla/mozilla/cmd/xfe/src/TaskBarDrop.cpp
dmose%mozilla.org 83e38c06cc updated license boilerplate to xPL v1.1
git-svn-id: svn://10.0.0.236/trunk@52594 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-02 22:43:10 +00:00

261 lines
6.7 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.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/*
TaskBarDrop.cpp -- class definition for the task bar drop class
Created: Alastair Gourlay <sgidev@netscape.com>, 1-Jan-96.
*/
#include "TaskBarDrop.h"
#include "Command.h"
#include "BrowserFrame.h"
#ifdef MOZ_MAIL_NEWS
#include "ComposeFrame.h"
#include "ComposeAttachFolderView.h"
#endif
#ifdef EDITOR
#include "EditorFrame.h"
#endif
#include <Xfe/Button.h>
#include "xfe2_extern.h"
#ifdef DEBUG_sgidev
#define XDEBUG(x) x
#else
#define XDEBUG(x)
#endif
//
// XFE_TaskBarDrop class
//
// constructor
XFE_TaskBarDrop::XFE_TaskBarDrop(Widget parent,const char *command)
: XFE_DropNetscape(parent)
{
_command=command;
// Configure the drop site
Arg xargs[1];
Cardinal n = 0;
XtSetArg(xargs[n],XmNanimationStyle, XmDRAG_UNDER_NONE); n++;
update(xargs,n);
}
XFE_TaskBarDrop::~XFE_TaskBarDrop()
{
}
void XFE_TaskBarDrop::targets()
{
_numTargets=2;
_targets=new Atom[_numTargets];
_targets[0]=_XA_NETSCAPE_URL;
_targets[1]=XA_STRING;
acceptFileTargets();
}
void XFE_TaskBarDrop::operations()
{
// always copy - move/link irrelevant
_operations=(unsigned int)XmDROP_COPY;
}
/* virtual */ void
XFE_TaskBarDrop::dragIn()
{
XtVaSetValues(_widget,XmNraised,True,NULL);
}
/* virtual */ void
XFE_TaskBarDrop::dragOut()
{
XtVaSetValues(_widget,XmNraised,False,NULL);
}
int XFE_TaskBarDrop::processTargets(Atom *targets,const char **data,int numItems)
{
XDEBUG(printf("XFE_TaskBarDrop::processTargets()\n"));
if (!targets || !data || numItems==0)
return FALSE;
int i;
int urlCount=0;
// count # of items in list (need to expand multi-item NetscapeURL data)
for (i=0;i<numItems;i++) {
if (targets[i]==None || data[i]==NULL || strlen(data[i])==0)
continue;
if (targets[i]==_XA_FILE_NAME) urlCount++;
else if (targets[i]==XA_STRING) urlCount++;
else if (targets[i]==_XA_NETSCAPE_URL) {
XFE_URLDesktopType urlData(data[i]);
urlCount+=urlData.numItems();
}
}
char **urlList=new char*[urlCount];
// create list of urls for dropped documents
int j;
for (i=0,j=0;i<numItems;i++) {
if (targets[i]==None || data[i]==NULL || strlen(data[i])==0)
continue;
XDEBUG(printf(" [%d] %s: \"%s\"\n",i,XmGetAtomName(XtDisplay(_widget),targets[i]),data[i]));
if (targets[i]==_XA_FILE_NAME)
urlList[j++]=XP_STRDUP(data[i]);
else if (targets[i]==XA_STRING)
urlList[j++]=XP_STRDUP(data[i]);
else if (targets[i]==_XA_NETSCAPE_URL) {
XFE_URLDesktopType urlData(data[i]);
for (int k=0;k<urlData.numItems();k++)
urlList[j++]=XP_STRDUP(urlData.url(k));
}
}
// execute command on url list
// Browser or Editor drop - open each document in a new window
if (_command==xfeCmdOpenOrBringUpBrowser
#ifdef EDITOR
|| _command==xfeCmdOpenEditor
#endif
) {
for (i=0;i<urlCount;i++)
openDocument(urlList[i]);
}
#ifdef MOZ_MAIL_NEWS
// Mail or News drop - open one compose window with documents attached
if (_command==xfeCmdOpenInboxAndGetNewMessages ||
_command==xfeCmdOpenNewsgroups) {
openComposeWindow((const char**)urlList,urlCount);
}
#endif
// free url list
for (j=0;j<urlCount;j++)
if (urlList[j]) XP_FREE((void*)urlList[j]);
delete urlList;
return TRUE;
}
// process drop on browser or editor task icons
void XFE_TaskBarDrop::openDocument(const char *url)
{
if (!url) return;
URL_Struct *urlStruct = NET_CreateURLStruct (url,NET_DONT_RELOAD);
if (!urlStruct)
return;
#ifdef MOZ_MAIL_NEWS
// Don't open a window if this is not a document URL
if (!MSG_RequiresBrowserWindow(urlStruct->address)) {
MWContext *context=XP_GetNonGridContext(fe_all_MWContexts->context);
if (context)
fe_GetURL(context,urlStruct, FALSE);
else
NET_FreeURLStruct(urlStruct);
return;
}
#endif
// Open a new window with this URL
if (_command==xfeCmdOpenOrBringUpBrowser) {
fe_showBrowser(FE_GetToplevelWidget(),
NULL,
NULL,
urlStruct);
}
#ifdef EDITOR
else if (_command==xfeCmdOpenEditor) {
fe_showEditor(XfeAncestorFindApplicationShell(_widget),
NULL,
NULL,
urlStruct);
}
#endif
}
#ifdef MOZ_MAIL_NEWS
// process drop on mail or news taskbar icons
void XFE_TaskBarDrop::openComposeWindow(const char **urlList,int urlCount)
{
MWContext *context=XP_GetNonGridContext(fe_all_MWContexts->context);
if (!context)
return;
MSG_Pane* pane = fe_showCompose(XtParent(CONTEXT_WIDGET(context)),
NULL,
context,
NULL,
NULL,
MSG_DEFAULT,
(_command==xfeCmdOpenNewsgroups ? True : False)
);
// add urlList as attachments
MSG_AttachmentData *attachments=new struct MSG_AttachmentData[urlCount+1];
int i;
int numAttachments=0;
for (i=0;i<urlCount;i++) {
if (XFE_ComposeAttachFolderView::validateAttachment(_widget,urlList[i])) {
struct MSG_AttachmentData m = { 0 };
m.url=XP_STRDUP(urlList[i]);
m.desired_type=NULL;
attachments[numAttachments++]=m;
}
}
if (numAttachments>0) {
attachments[numAttachments].url=NULL; // terminate list
MSG_SetAttachmentList(pane,attachments);
}
// delete list
for (i=0;i<numAttachments;i++) {
if (attachments[i].url)
XP_FREE((void*)attachments[i].url);
}
delete attachments;
}
#endif // MOZ_MAIL_NEWS