Mozilla/mozilla/cmd/xfe/src/LocationDrag.cpp
ramiro%netscape.com 1b7053743f Fix the urlbar somemore. It now set the url string properly.
git-svn-id: svn://10.0.0.236/trunk@13019 18797224-902f-48f8-a5cc-f745e15eee43
1998-10-16 21:31:54 +00:00

165 lines
3.9 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.
*/
/*
LocationDrag.cpp -- class definitions for browser location drag source
Created: Alastair Gourlay(SGI) c/o Dora Hsu<dora@netscape.com>, 26 Nov 1996
*/
// classes:
// XFE_LocationDrag
//
#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/AtomMgr.h>
#include <Xfe/ButtonP.h>
#include "icondata.h"
#include "LocationDrag.h"
#ifdef DEBUG_sgidev
#define XDEBUG(x) x
#else
#define XDEBUG(x)
#endif
// constructor
XFE_LocationDrag::XFE_LocationDrag(Widget w) : XFE_DragNetscape(w)
{
_dragDataURL=NULL;
}
// destructor
XFE_LocationDrag::~XFE_LocationDrag()
{
if (_dragDataURL) {
XP_FREE(_dragDataURL);
_dragDataURL=NULL;
}
}
// set drag data, for later use by drag callback
void XFE_LocationDrag::setDragDataFromURL(URL_Struct* u)
{
if (_dragDataURL)
XP_FREE(_dragDataURL);
_dragDataURL=((u && u->address) ? XP_STRDUP(u->address) : 0);
}
void XFE_LocationDrag::setDragDataFromString(const String str)
{
if (_dragDataURL)
XP_FREE(_dragDataURL);
_dragDataURL = str ? XP_STRDUP(str) : 0;
}
// decide if this drag is interesting
int XFE_LocationDrag::dragStart(int,int)
{
if (!_dragDataURL)
return FALSE;
if (isFileURL(_dragDataURL))
dragFilesAsLinks(TRUE);
// Move the hot spot down to the pointy part of the icon.
_dragHotY = 10;
setDragIcon(&LocationProxy);
return TRUE;
}
void XFE_LocationDrag::dragComplete()
{
/*
* The proxy icon button never received Disarm() and Enter() events
* cause the drag and drop event handlers are stealing them. The
* "correct" way to fix this would be to have the XfeButton button
* install dnd translations/actions and have the XFE_DragBase class
* deal with this...but that would involve major work.
* would also mean that the drag and drop code would have to deal with
*
* The most reasonable course of action is deal with this unique case
* here by forcing the proxy icon to return to the "normal" state
* everytime the drag operation is complete.
*/
if (XfeIsAlive(_widget) && XfeIsButton(_widget))
{
_XfeButtonDisarm(_widget,NULL,NULL,NULL);
_XfeButtonLeave(_widget,NULL,NULL,NULL);
}
}
// specify types for this particular drag
void XFE_LocationDrag::targets()
{
_numTargets=2;
_targets=new Atom[_numTargets];
_targets[0]=_XA_NETSCAPE_URL;
_targets[1]=XA_STRING;
setFileTarget(_XA_NETSCAPE_URL);
}
// specify operations for this particular drag
void XFE_LocationDrag::operations()
{
_operations=XmDROP_COPY;
}
// provide data for requested target from targets() list
char *XFE_LocationDrag::getTargetData(Atom target)
{
// WARNING - data *must* be allocated with Xt malloc API, or Xt
// will spring a leak!
if (!_dragDataURL)
return NULL;
if (target==_XA_NETSCAPE_URL) {
// translate drag data to NetscapeURL format
XFE_URLDesktopType urlData;
urlData.createItemList(1);
urlData.url(0,_dragDataURL);
return (char*) XtNewString(urlData.getString());
}
if (target==XA_STRING) {
// return the URL
return (char*) XtNewString(_dragDataURL);
}
return NULL;
}