From dbd6d99329fdc042cd3c190f10f4d3da720f287c Mon Sep 17 00:00:00 2001 From: "slamm%netscape.com" Date: Tue, 8 Sep 1998 20:14:06 +0000 Subject: [PATCH] more support for pane creation/deletion. --- cmd/xfe/src/RDFBase.cpp | 207 +++++++++++++++++++++++----------------- cmd/xfe/src/RDFBase.h | 20 ++-- 2 files changed, 130 insertions(+), 97 deletions(-) diff --git a/cmd/xfe/src/RDFBase.cpp b/cmd/xfe/src/RDFBase.cpp index 91f9e849402..fbc56c9bc8c 100644 --- a/cmd/xfe/src/RDFBase.cpp +++ b/cmd/xfe/src/RDFBase.cpp @@ -46,37 +46,18 @@ XFE_RDFBase::XFE_RDFBase() /*virtual*/ XFE_RDFBase::~XFE_RDFBase() { + XFE_RDFBase * xfe_view = (XFE_RDFBase *)HT_GetViewFEData(_ht_view); + if (xfe_view == this) + { + // HT is holding onto a pointer to this class. + // Since this is going away, clear the pointer from HT. + HT_SetViewFEData(_ht_view, NULL); + } + if (isPaneCreator()) { deletePane(); } - else - { - HT_SetViewFEData(_ht_view, NULL); - } -} -////////////////////////////////////////////////////////////////////////// -/*static*/ XP_Bool -XFE_RDFBase::ht_IsFECommand(HT_Resource item) -{ - const char* url = HT_GetNodeURL(item); - - return (XP_STRNCMP(url, "command:", 8) == 0); -} -////////////////////////////////////////////////////////////////////////// -/*static*/ CommandType -XFE_RDFBase::ht_GetFECommand(HT_Resource item) -{ - const char* url = HT_GetNodeURL(item); - - if (url && XP_STRNCMP(url, "command:", 8) == 0) - { - return Command::convertOldRemote(url + 8); - } - else - { - return NULL; - } } ////////////////////////////////////////////////////////////////////////// void @@ -121,6 +102,22 @@ XFE_RDFBase::newPaneFromResource(RDF_Resource node) } ////////////////////////////////////////////////////////////////////////// void +XFE_RDFBase::newBookmarksPane() +{ + newPane(); + HT_View view = HT_GetViewType(_ht_pane, HT_VIEW_BOOKMARK); + HT_SetSelectedView(_ht_pane, view); +} +////////////////////////////////////////////////////////////////////////// +void +XFE_RDFBase::newHistoryPane() +{ + newPane(); + HT_View view = HT_GetViewType(_ht_pane, HT_VIEW_HISTORY); + HT_SetSelectedView(_ht_pane, view); +} +////////////////////////////////////////////////////////////////////////// +void XFE_RDFBase::newToolbarPane() { startPaneCreate(); @@ -130,6 +127,75 @@ XFE_RDFBase::newToolbarPane() finishPaneCreate(); } ////////////////////////////////////////////////////////////////////////// +void +XFE_RDFBase::startPaneCreate() +{ + deletePane(); + + // Setup the notification struct + _ht_ns = new HT_NotificationStruct; + XP_BZERO(_ht_ns, sizeof(HT_NotificationStruct)); + _ht_ns->notifyProc = notify_cb; + _ht_ns->data = this; +} +////////////////////////////////////////////////////////////////////// +void +XFE_RDFBase::finishPaneCreate() +{ + HT_SetPaneFEData(_ht_pane, this); + + _ht_view = HT_GetSelectedView(_ht_pane); +} +////////////////////////////////////////////////////////////////////// +void +XFE_RDFBase::deletePane() +{ + if (_ht_ns) + { + delete _ht_ns; + _ht_ns = NULL; + + XP_ASSERT(_ht_pane); + + if (_ht_pane) + { + HT_DeletePane(_ht_pane); + } + } +} +////////////////////////////////////////////////////////////////////////// +void +XFE_RDFBase::setHTView(HT_View view) +{ + XP_ASSERT(view); + + // Nothing to do + if (view == _ht_view) return; + + _ht_view = view; + + HT_Pane pane = HT_GetPane(_ht_view); + + // It is an error to switch to a new pane in setHTView() + // if this object is the HT_Pane creator. + // Use the new pane methods instead. + XP_ASSERT(!isPaneCreator() || _ht_pane == pane); + + _ht_pane = pane; + + HT_SetViewFEData(view, this); + + updateRoot(); +} +////////////////////////////////////////////////////////////////////////// +XP_Bool +XFE_RDFBase::isPaneCreator() +{ + // Pane was created by this object if the notification struct is set. + // No nofication struct means the pane was created by another object. + return _ht_ns != NULL; +} +////////////////////////////////////////////////////////////////////////// HT_Resource XFE_RDFBase::getRootFolder() { @@ -154,6 +220,29 @@ XFE_RDFBase::updateRoot() { } ////////////////////////////////////////////////////////////////////////// +/*static*/ XP_Bool +XFE_RDFBase::ht_IsFECommand(HT_Resource item) +{ + const char* url = HT_GetNodeURL(item); + + return (XP_STRNCMP(url, "command:", 8) == 0); +} +////////////////////////////////////////////////////////////////////////// +/*static*/ CommandType +XFE_RDFBase::ht_GetFECommand(HT_Resource item) +{ + const char* url = HT_GetNodeURL(item); + + if (url && XP_STRNCMP(url, "command:", 8) == 0) + { + return Command::convertOldRemote(url + 8); + } + else + { + return NULL; + } +} +////////////////////////////////////////////////////////////////////////// /*virtual*/ void XFE_RDFBase::notify(HT_Resource n, HT_Event whatHappened) { @@ -170,7 +259,7 @@ XFE_RDFBase::notify(HT_Resource n, HT_Event whatHappened) HT_View ht_view = HT_GetView(n); XFE_RDFBase * xfe_view = (XFE_RDFBase *)HT_GetViewFEData(ht_view); - if (xfe_view) + if (xfe_view && xfe_view != this) xfe_view->notify(n, whatHappened); } break; @@ -191,66 +280,6 @@ XFE_RDFBase::notify_cb(HT_Notification ns, HT_Resource n, xfe_rdfpane_obj->notify(n, whatHappened); } -////////////////////////////////////////////////////////////////////// -void -XFE_RDFBase::startPaneCreate() -{ - deletePane(); - - // Setup the notification struct - _ht_ns = new HT_NotificationStruct; - XP_BZERO(_ht_ns, sizeof(HT_NotificationStruct)); - _ht_ns->notifyProc = notify_cb; - _ht_ns->data = this; -} -////////////////////////////////////////////////////////////////////// -void -XFE_RDFBase::finishPaneCreate() -{ - HT_SetPaneFEData(_ht_pane, this); - - //HT_SetNotificationMask(_ht_pane, NULL); -} -////////////////////////////////////////////////////////////////////// -void -XFE_RDFBase::deletePane() -{ - if (_ht_ns) - { - delete _ht_ns; - - XP_ASSERT(_ht_pane); - - if (_ht_pane) - { - HT_DeletePane(_ht_pane); - } - } -} -////////////////////////////////////////////////////////////////////////// -void -XFE_RDFBase::setHTView(HT_View view) -{ - XP_ASSERT(view); - - // Nothing to do - if (view == _ht_view) return; - - _ht_view = view; - _ht_pane = HT_GetPane(_ht_view); - - HT_SetViewFEData(view, this); - - updateRoot(); -} -////////////////////////////////////////////////////////////////////////// -XP_Bool -XFE_RDFBase::isPaneCreator() -{ - // Pane was created by this object if the notification struct is set. - // No nofication struct means the pane was created by another object. - return _ht_ns != NULL; -} ////////////////////////////////////////////////////////////////////////// #ifdef DEBUG void @@ -299,7 +328,7 @@ XFE_RDFBase::debugEvent(HT_Resource n, HT_Event whatHappened, printf(" "); #ifdef DEBUG_slamm -#define EVENTDEBUG(x) printf("%s: %-21s (0x%x) %s, %s\n",\ +#define EVENTDEBUG(x) printf("%s: %s (0x%x) %s, %s\n",\ label,(x),pane,viewName,nodeName); #else #define EVENTDEBUG(x) diff --git a/cmd/xfe/src/RDFBase.h b/cmd/xfe/src/RDFBase.h index 634602b1b2a..82aa9d410a4 100644 --- a/cmd/xfe/src/RDFBase.h +++ b/cmd/xfe/src/RDFBase.h @@ -41,13 +41,10 @@ public: virtual ~XFE_RDFBase (); - // Is the URL a 'special' command url that - // translates to an FE command? - static XP_Bool ht_IsFECommand (HT_Resource item); - static CommandType ht_GetFECommand (HT_Resource item); - // Pane creation methods. void newPane (); + void newBookmarksPane (); + void newHistoryPane (); void newToolbarPane (); void newPaneFromURL (char * url, int param_count = 0, @@ -74,6 +71,13 @@ public: // Update the current view from the root. virtual void updateRoot (); + + // Is the URL a 'special' command url that + // translates to an FE command? + static XP_Bool ht_IsFECommand (HT_Resource item); + static CommandType ht_GetFECommand (HT_Resource item); + + // Handle HT events virtual void notify (HT_Resource n, HT_Event whatHappened); @@ -84,10 +88,10 @@ protected: void *token, uint32 tokenType); // Called by the pane creation methods - void startPaneCreate (); - void finishPaneCreate (); + virtual void startPaneCreate (); + virtual void finishPaneCreate (); - void deletePane (); + virtual void deletePane (); #ifdef DEBUG void debugEvent (HT_Resource n, HT_Event e,