From 8f9d02cb354081b57331e00292c30baabf3b4d2a Mon Sep 17 00:00:00 2001 From: "slamm%netscape.com" Date: Sat, 17 Oct 1998 01:09:02 +0000 Subject: [PATCH] Bring toolbar drag/drop back to life. --- cmd/xfe/src/RDFToolbar.cpp | 111 ++++++++++++++++++++++++++++++ cmd/xfe/src/RDFToolbar.h | 26 ++++++- cmd/xfe/src/ToolbarDrop.cpp | 131 +++++++++++++----------------------- cmd/xfe/src/ToolbarDrop.h | 20 +++--- 4 files changed, 193 insertions(+), 95 deletions(-) diff --git a/cmd/xfe/src/RDFToolbar.cpp b/cmd/xfe/src/RDFToolbar.cpp index bfa03bcca94..f05322b7d41 100644 --- a/cmd/xfe/src/RDFToolbar.cpp +++ b/cmd/xfe/src/RDFToolbar.cpp @@ -42,6 +42,7 @@ #include "ToolbarSeparator.h" #include "ToolbarUrlBar.h" #include "ToolbarWindowList.h" +#include "ToolbarDrop.h" #if DEBUG_radha #define D(x) x @@ -112,6 +113,17 @@ XFE_RDFToolbar::XFE_RDFToolbar(XFE_Frame * frame, setHTView(view); + + _toolbarDropSite = new XFE_RDFToolbarDrop(_toolbar, this); + _toolbarDropSite->enable(); + + // Configure the drop site + Arg xargs[1]; + Cardinal n = 0; + + XtSetArg(xargs[n],XmNanimationStyle, XmDRAG_UNDER_NONE); n++; + _toolbarDropSite->update(xargs,n); + show(); _frame->registerInterest(XFE_View::commandNeedsUpdating, @@ -140,6 +152,10 @@ XFE_RDFToolbar::XFE_RDFToolbar(XFE_Frame * frame, XFE_RDFToolbar::~XFE_RDFToolbar() { + if (_toolbarDropSite) + { + delete _toolbarDropSite; + } _frame->unregisterInterest(XFE_View::commandNeedsUpdating, this, (XFE_FunctionNotification)updateCommand_cb); @@ -255,6 +271,54 @@ XFE_RDFToolbar::update() #endif /*NOT_YET*/ } ////////////////////////////////////////////////////////////////////////// +Widget +XFE_RDFToolbar::getFirstItem() +{ + return XfeToolBarGetFirstItem(_toolbar); +} +////////////////////////////////////////////////////////////////////////// +Widget +XFE_RDFToolbar::getLastItem() +{ + return XfeToolBarGetLastItem(_toolbar); +} +////////////////////////////////////////////////////////////////////////// +Widget +XFE_RDFToolbar::getIndicatorItem() +{ + return XfeToolBarGetIndicatorItem(_toolbar); +} +////////////////////////////////////////////////////////////////////////// +void +XFE_RDFToolbar::configureIndicatorItem(HT_Resource entry) +{ + Widget indicator = getIndicatorItem(); + + if (XfeIsAlive(indicator)) + { + Pixmap pixmap = XmUNSPECIFIED_PIXMAP; + Pixmap pixmapMask = XmUNSPECIFIED_PIXMAP; + Pixmap armedPixmap = XmUNSPECIFIED_PIXMAP; + Pixmap armedPixmapMask = XmUNSPECIFIED_PIXMAP; + + if (entry) + { + XFE_RDFUtils::getPixmapsForEntry(_toolbar, + entry, + &pixmap, + &pixmapMask, + &armedPixmap, + &armedPixmapMask); + } + + XtVaSetValues(indicator, + XmNpixmap, pixmap, + XmNpixmapMask, pixmapMask, + XmNbuttonLayout, XmBUTTON_LABEL_ON_RIGHT, + NULL); + } +} +////////////////////////////////////////////////////////////////////////// void XFE_RDFToolbar::notify(HT_Resource n, HT_Event whatHappened) { @@ -587,6 +651,53 @@ XFE_RDFToolbar::updateAppearance() updateRoot(); } +////////////////////////////////////////////////////////////////////////// + +// +// DND feedback methods +// +Widget +XFE_RDFToolbar::getDropTargetItem() +{ + return _dropTargetItem; +} +////////////////////////////////////////////////////////////////////////// +unsigned char +XFE_RDFToolbar::getDropTargetLocation() +{ + return _dropTargetLocation; +} +////////////////////////////////////////////////////////////////////////// +void +XFE_RDFToolbar::setDropTargetItem(Widget item,int x) +{ + assert( XfeIsAlive(item) ); + + _dropTargetItem = item; + + _dropTargetLocation = XfeToolBarXYToIndicatorLocation(_toolbar, + _dropTargetItem, + x,0); + + int position = XfeChildGetIndex(_dropTargetItem); + + XtVaSetValues(_toolbar, + XmNindicatorPosition, position, + XmNindicatorLocation, _dropTargetLocation, + NULL); +} +////////////////////////////////////////////////////////////////////////// +void +XFE_RDFToolbar::clearDropTargetItem() +{ + _dropTargetItem = NULL; + + XtVaSetValues(_toolbar, + XmNindicatorPosition, XmINDICATOR_DONT_SHOW, + NULL); +} +////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// /* static */ void diff --git a/cmd/xfe/src/RDFToolbar.h b/cmd/xfe/src/RDFToolbar.h index e251ca4abdb..8315e75c781 100644 --- a/cmd/xfe/src/RDFToolbar.h +++ b/cmd/xfe/src/RDFToolbar.h @@ -37,6 +37,7 @@ class XFE_Frame; class XFE_Logo; class XFE_Toolbox; +class XFE_RDFToolbarDrop; class XFE_RDFToolbar : public XFE_ToolboxItem, public XFE_RDFMenuToolbarBase @@ -48,6 +49,12 @@ public: virtual ~XFE_RDFToolbar (); + // Access methods + Widget getFirstItem (); + Widget getLastItem (); + Widget getIndicatorItem (); + void configureIndicatorItem (HT_Resource entry); + #ifdef NOT_YET // update all the commands in the toolbar. XFE_CALLBACK_DECL(update) @@ -68,6 +75,13 @@ public: ////////////////////////////////////////////////////////////////////// static const char * navigateToUrlNotice; + // DND feedback methods + Widget getDropTargetItem (); + unsigned char getDropTargetLocation (); + + void setDropTargetItem (Widget item,int x); + void clearDropTargetItem (); + protected: void setRaised (XP_Bool); void destroyToolbarWidgets (); @@ -86,12 +100,18 @@ protected: virtual void updateRoot (); // Gets called to update icon appearance - virtual void updateAppearance (); + virtual void updateAppearance (); private: - XFE_Frame * _frame; - Widget _toolbar; + XFE_Frame * _frame; + Widget _toolbar; + XFE_RDFToolbarDrop * _toolbarDropSite; + + // DND feedback members + Widget _dropTargetItem; // The drop target item + unsigned char _dropTargetLocation; // The drop target location + int _dropTargetPosition; // The drop target position // callbacks static void tooltipCB(Widget, XtPointer, XmString *, Boolean *); diff --git a/cmd/xfe/src/ToolbarDrop.cpp b/cmd/xfe/src/ToolbarDrop.cpp index 22612ff62b3..0b61523bf1b 100644 --- a/cmd/xfe/src/ToolbarDrop.cpp +++ b/cmd/xfe/src/ToolbarDrop.cpp @@ -26,11 +26,10 @@ #include "MozillaApp.h" #include "ToolbarDrop.h" -#ifdef OLD_BOOKMARKS -#include "PersonalToolbar.h" -#endif /*OLD_BOOKMARKS*/ +#include "ToolbarItem.h" #include "BookmarkMenu.h" #include "htrdf.h" +#include "RDFToolbar.h" #include "RDFUtils.h" #include @@ -182,52 +181,35 @@ XFE_ToolbarDrop::addEntry(const char * /* address */,const char * /* title */) { } ////////////////////////////////////////////////////////////////////////// -#if 0 + // -// XFE_PersonalDrop class +// XFE_RDFToolbarDrop class // ////////////////////////////////////////////////////////////////////////// -XFE_PersonalDrop::XFE_PersonalDrop(Widget dropWidget, - XFE_PersonalToolbar * toolbar) : +XFE_RDFToolbarDrop::XFE_RDFToolbarDrop(Widget dropWidget, + XFE_RDFToolbar * toolbar) : XFE_ToolbarDrop(dropWidget), - _personalToolbar(toolbar), + _toolbar(toolbar), _dropWidget(NULL) { } ////////////////////////////////////////////////////////////////////////// -XFE_PersonalDrop::~XFE_PersonalDrop() +XFE_RDFToolbarDrop::~XFE_RDFToolbarDrop() { } ////////////////////////////////////////////////////////////////////////// /* virtual */ void -XFE_PersonalDrop::addEntry(const char * address,const char * title) +XFE_RDFToolbarDrop::addEntry(const char * address, const char * title) { XP_ASSERT( address != NULL ); XP_ASSERT( XfeIsAlive(_dropWidget) ); - XP_ASSERT( _personalToolbar != NULL ); + XP_ASSERT( _toolbar != NULL ); - char * guessed_title = (char *) title; - time_t lastAccess = 0; + unsigned char location = _toolbar->getDropTargetLocation(); - // If no title is given, try to guess a decent one - if (!guessed_title) - { - MWContext * context = _personalToolbar->getFrame()->getContext(); - - XFE_RDFUtils::guessTitle(context, - address, - isFromSameShell(), - &guessed_title, - &lastAccess); - } - - XP_ASSERT( guessed_title != NULL ); - - unsigned char location = _personalToolbar->getDropTargetLocation(); - - // If the drop occurred on a cascade item, then we need to waid for + // If the drop occurred on a cascade item, then we need to wait for // the drop operation to complete before posting the submenu id and // allowing the user to place the new bookmark. This will happen // in dropCompolete(). Here, we just install the drop parameters that @@ -240,20 +222,14 @@ XFE_PersonalDrop::addEntry(const char * address,const char * title) { if (location == XmINDICATOR_LOCATION_BEGINNING) { - _personalToolbar->addEntryBefore(address, - guessed_title, - lastAccess, - entry); + HT_DropURLAndTitleAtPos(entry, (char*)address, (char*)title, TRUE); // Clear drop widget so dropComplete() does not get hosed _dropWidget = NULL; } else if (location == XmINDICATOR_LOCATION_END) { - _personalToolbar->addEntryAfter(address, - guessed_title, - lastAccess, - entry); + HT_DropURLAndTitleAtPos(entry, (char*)address, (char*)title, FALSE); // Clear drop widget so dropComplete() does not get hosed _dropWidget = NULL; @@ -261,12 +237,10 @@ XFE_PersonalDrop::addEntry(const char * address,const char * title) else if (location == XmINDICATOR_LOCATION_MIDDLE) { // If the folder is empty, then just add the new bm to it - if (HT_IsContainer(entry) && !BM_GetChildren(entry)) + if (HT_IsContainer(entry) + && !XFE_RDFUtils::ht_FolderHasChildren(entry)) { - _personalToolbar->addEntryToFolder(address, - guessed_title, - lastAccess, - entry); + HT_DropURLAndTitleOn(entry,(char*)address, (char*)title); // Clear drop widget so dropComplete() does not get hosed _dropWidget = NULL; @@ -274,9 +248,8 @@ XFE_PersonalDrop::addEntry(const char * address,const char * title) // Otherwise need to popup the bookmark placement gui later else { - _personalToolbar->setDropAddress(address); - _personalToolbar->setDropTitle(guessed_title); - _personalToolbar->setDropLastAccess(lastAccess); + _toolbar->setDropAddress((char*)address); + _toolbar->setDropTitle((char*)title); } } } @@ -291,21 +264,15 @@ XFE_PersonalDrop::addEntry(const char * address,const char * title) { if (location == XmINDICATOR_LOCATION_BEGINNING) { - _personalToolbar->addEntryBefore(address, - guessed_title, - lastAccess, - entry); + HT_DropURLAndTitleAtPos(entry, (char*)address, (char*)title, TRUE); } else if (location == XmINDICATOR_LOCATION_END) { - _personalToolbar->addEntryAfter(address, - guessed_title, - lastAccess, - entry); + HT_DropURLAndTitleAtPos(entry, (char*)address, (char*)title, FALSE); } else { - _personalToolbar->addEntry(address,guessed_title,lastAccess); + HT_DropURLAndTitleAtPos(entry, (char*)address, (char*)title, FALSE); } } @@ -325,9 +292,9 @@ XFE_PersonalDrop::addEntry(const char * address,const char * title) } ////////////////////////////////////////////////////////////////////////// /* virtual */ void -XFE_PersonalDrop::dropComplete() +XFE_RDFToolbarDrop::dropComplete() { - _personalToolbar->clearDropTargetItem(); + _toolbar->clearDropTargetItem(); // If the drop widget is still alive and kicking, it means that a drop // occurred on a cascade item. Here we deal with this unique case. @@ -343,7 +310,7 @@ XFE_PersonalDrop::dropComplete() XfeSleep(_dropWidget,fe_EventLoop,DROP_POST_SLEEP_LENGTH); // Enable dropping into the personal toolbar - _personalToolbar->enableDropping(); + _toolbar->enableDropping(); // Arm and post the cascade. Once the cascade button's submenu id // is posted, the bookmark menu items it manages will detect @@ -362,21 +329,21 @@ XFE_PersonalDrop::dropComplete() } ////////////////////////////////////////////////////////////////////////// /* virtual */ void -XFE_PersonalDrop::dragIn() +XFE_RDFToolbarDrop::dragIn() { dragMotion(); } ////////////////////////////////////////////////////////////////////////// /* virtual */ void -XFE_PersonalDrop::dragOut() +XFE_RDFToolbarDrop::dragOut() { - _dropWidget = _personalToolbar->getDropTargetItem(); + _dropWidget = _toolbar->getDropTargetItem(); - _personalToolbar->clearDropTargetItem(); + _toolbar->clearDropTargetItem(); } ////////////////////////////////////////////////////////////////////////// /* virtual */ void -XFE_PersonalDrop::dragMotion() +XFE_RDFToolbarDrop::dragMotion() { // Try to find an item at the X,Y that the motion occured Widget target = XfeDescendantFindByCoordinates(_widget, @@ -385,39 +352,36 @@ XFE_PersonalDrop::dragMotion() // If we found the indicator, ignore it - if (target != _personalToolbar->getIndicatorItem()) + if (target != _toolbar->getIndicatorItem()) { // If an item is found, use it as the target if (XfeIsAlive(target)) { - _personalToolbar->setDropTargetItem(target, - _dropEventX - XfeX(target)); + _toolbar->setDropTargetItem(target, _dropEventX - XfeX(target)); - // The argument should really be a (HT_Resource) - _personalToolbar->configureIndicatorItem(NULL); + _toolbar->configureIndicatorItem(NULL); } // Otherwise use the last item else { - Widget last = _personalToolbar->getLastItem(); + Widget last = _toolbar->getLastItem(); // The 10000 forces the position to be at the END of the item if (XfeIsAlive(last)) { - _personalToolbar->setDropTargetItem(last,10000); + _toolbar->setDropTargetItem(last,10000); - // The argument should really be a (HT_Resource) - _personalToolbar->configureIndicatorItem(NULL); + _toolbar->configureIndicatorItem(NULL); } } } // Assign the drop widget so that addEntry() can do its magic - _dropWidget = _personalToolbar->getDropTargetItem(); + _dropWidget = _toolbar->getDropTargetItem(); } ////////////////////////////////////////////////////////////////////////// - +#if 0 // // XFE_PersonalTabDrop class // @@ -425,9 +389,10 @@ XFE_PersonalDrop::dragMotion() ////////////////////////////////////////////////////////////////////////// XFE_PersonalTabDrop::XFE_PersonalTabDrop(Widget dropWidget, XFE_PersonalToolbar * toolbar) : - XFE_PersonalDrop(dropWidget,toolbar) + XFE_RDFToolbarDrop(dropWidget,toolbar) { } + ////////////////////////////////////////////////////////////////////////// XFE_PersonalTabDrop::~XFE_PersonalTabDrop() { @@ -438,7 +403,7 @@ XFE_PersonalTabDrop::addEntry(const char * address,const char * title) { XP_ASSERT( address != NULL ); - XP_ASSERT( _personalToolbar != NULL ); + XP_ASSERT( _toolbar != NULL ); char * guessed_title = (char *) title; time_t lastAccess = 0; @@ -446,7 +411,7 @@ XFE_PersonalTabDrop::addEntry(const char * address,const char * title) // If no title is given, try to guess a decent one if (!guessed_title) { - XFE_BookmarkBase::guessTitle(_personalToolbar->getFrame(), + XFE_BookmarkBase::guessTitle(_toolbar->getFrame(), address, isFromSameShell(), &guessed_title, @@ -465,7 +430,7 @@ XFE_PersonalTabDrop::addEntry(const char * address,const char * title) // If the first entry exists, add the new entry before it if (entry) { - _personalToolbar->addEntryBefore(address, + _toolbar->addEntryBefore(address, guessed_title, lastAccess, entry); @@ -473,7 +438,7 @@ XFE_PersonalTabDrop::addEntry(const char * address,const char * title) // Otherwise add the entry to the personal toolbar folder else { - _personalToolbar->addEntry(address,guessed_title,lastAccess); + _toolbar->addEntry(address,guessed_title,lastAccess); } } @@ -491,15 +456,15 @@ XFE_PersonalTabDrop::dropComplete() XFE_PersonalTabDrop::dragIn() { - Widget first = _personalToolbar->getFirstItem(); + Widget first = _toolbar->getFirstItem(); // The 0 forces the position to be at the first if (XfeIsAlive(first)) { - _personalToolbar->setDropTargetItem(first,0); + _toolbar->setDropTargetItem(first,0); // The argument should really be a (HT_Resource) - _personalToolbar->configureIndicatorItem(NULL); + _toolbar->configureIndicatorItem(NULL); } XfeTabDrawRaised(_widget,True); @@ -510,7 +475,7 @@ XFE_PersonalTabDrop::dragOut() { XfeTabDrawRaised(_widget,False); - _personalToolbar->clearDropTargetItem(); + _toolbar->clearDropTargetItem(); } ////////////////////////////////////////////////////////////////////////// /* virtual */ void diff --git a/cmd/xfe/src/ToolbarDrop.h b/cmd/xfe/src/ToolbarDrop.h index 360635aebaa..fac7e108427 100644 --- a/cmd/xfe/src/ToolbarDrop.h +++ b/cmd/xfe/src/ToolbarDrop.h @@ -59,17 +59,18 @@ private: }; // -// XFE_PersonalDrop class +// XFE_RDFToolbarDrop class // -#if 0 -class XFE_PersonalDrop : public XFE_ToolbarDrop +class XFE_RDFToolbar; + +class XFE_RDFToolbarDrop : public XFE_ToolbarDrop { public: - XFE_PersonalDrop (Widget dropWidget, - XFE_PersonalToolbar * toolbar); + XFE_RDFToolbarDrop (Widget dropWidget, + XFE_RDFToolbar * toolbar); - virtual ~XFE_PersonalDrop (); + virtual ~XFE_RDFToolbarDrop (); protected: @@ -81,15 +82,16 @@ protected: protected: - XFE_PersonalToolbar * _personalToolbar; - Widget _dropWidget; + XFE_RDFToolbar * _toolbar; + Widget _dropWidget; }; +#if 0 // // XFE_PersonalTabDrop class // -class XFE_PersonalTabDrop : public XFE_PersonalDrop +class XFE_PersonalTabDrop : public XFE_RDFToolbarDrop { public: