home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-17 | 35.3 KB | 1,044 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: FWCyPart.cpp
- // Release Version: $ ODF 2 $
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- // Support for FW_OCyberPartExtension. Wraps it so that the developer
- // never needs to deal with SOM. Also implements basic recipes.
- //
- //========================================================================================
-
- #ifndef FWFRAMEW_HPP
- #include "FWFrameW.hpp"
- #endif
-
- #ifndef FWCYPART_H
- #include "FWCyPart.h"
- #endif
-
- #ifndef FWCYSTRM_H
- #include "FWCyStrm.h"
- #endif
-
- #ifndef FWMNUBAR_H
- #include "FWMnuBar.h"
- #endif
-
- #ifndef SLCYUTIL_H
- #include "SLCyUtil.h"
- #endif
-
- #ifndef FWPART_H
- #include "FWPart.h"
- #endif
-
- #ifndef FWFRAME_H
- #include "FWFrame.h"
- #endif
-
- #ifndef FWEXTMGR_H
- #include "FWExtMgr.h"
- #endif
-
- #ifndef FWITERS_H
- #include "FWIters.h"
- #endif
-
- #ifndef FWODTHRD_H
- #include "FWODThrd.h"
- #endif
-
- #ifndef FWSOMENV_H
- #include "FWSOMEnv.h"
- #endif
-
- //
- // Cyberdog
- //
-
- #ifndef __CYBERDOG__
- #include <Cyberdog.h>
- #endif
-
- #ifndef SOM_CyberSession_xh
- #include <CyberSession.xh>
- #endif
-
- #ifndef SOM_CyberProgressBroadcaster_xh
- #include <CyberProgressBroadcaster.xh>
- #endif
-
- #ifndef SOM_CyberOpenerPartExtension_xh
- #include <CyberOpenerPartExtension.xh>
- #endif
-
- #ifndef SOM_CyberNavigatorExtension_xh
- #include <CyberNavigatorExtension.xh>
- #endif
-
- #ifndef SOM_CyberServiceMenu_xh
- #include <CyberServiceMenu.xh>
- #endif
-
- #ifndef SOM_CyberStream_xh
- #include <CyberStream.xh>
- #endif
-
- //-----------------------------------------------------------------------------
- // FW_TOrderedCollection Runtime Information
- //-----------------------------------------------------------------------------
- #pragma mark FW_TOrderedCollection Runtime Information
-
- typedef FW_TOrderedCollectionIterator<FW_CThread> FW_CThreadsCollectionIterator;
-
- #ifdef FW_USE_TEMPLATE_PRAGMAS
- #pragma template_access public
- #pragma template FW_TOrderedCollection<FW_CThread>
- #pragma template FW_TOrderedCollectionIterator<FW_CThread>
- #endif
-
- FW_DEFINE_AUTO_TEMPLATE (FW_TOrderedCollection, FW_CThread)
- FW_DEFINE_AUTO_TEMPLATE (FW_TOrderedCollectionIterator, FW_CThread)
-
- #pragma mark -
- //========================================================================================
- // Class FW_TObjectSafety
- //========================================================================================
- #pragma mark Class FW_TObjectSafety
-
- /*
- FW_TObjectSafety is a smart pointer object. It's reusable and should be put
- in its own file somewhere.
-
- Semantics:
- FW_TObjectSafety() Assumes ownership of the object.
- ~FW_TObjectSafety() Deletes its object.
- Release() Returns its object; no longer owns it.
- No copy construction permitted. No assignment permitted.
- */
-
-
- template <class T>
- class FW_TObjectSafety {
- public:
- FW_DECLARE_AUTO (FW_TObjectSafety)
- FW_TObjectSafety (T* object);
- ~FW_TObjectSafety ();
- T* Release ();
- private:
- FW_TObjectSafety (const FW_TObjectSafety<T>& ) {}
- void operator= (const FW_TObjectSafety<T>& ) {}
- private:
- T* fObject;
- };
-
- //-----------------------------------------------------------------------------
- // FW_TObjectSafety Runtime Information
- //-----------------------------------------------------------------------------
-
- #ifdef FW_BUILD_MAC
- #pragma segment FWInternet
- #endif
-
- //-----------------------------------------------------------------------------
- // FW_TObjectSafety<T>::FW_TObjectSafety
- //-----------------------------------------------------------------------------
-
- template <class T>
- FW_TObjectSafety<T>::FW_TObjectSafety (T* object)
- : fObject (object)
- {
- FW_END_CONSTRUCTOR
- }
-
- //-----------------------------------------------------------------------------
- // FW_TObjectSafety<T>::~FW_TObjectSafety
- //-----------------------------------------------------------------------------
-
- template <class T>
- FW_TObjectSafety<T>::~FW_TObjectSafety ()
- {
- FW_START_DESTRUCTOR
- delete fObject;
- }
-
- //-----------------------------------------------------------------------------
- // FW_TObjectSafety<T>::Release
- //-----------------------------------------------------------------------------
-
- template <class T>
- T* FW_TObjectSafety<T>::Release ()
- {
- T* temporary = fObject;
- fObject = 0;
- return temporary;
- }
-
- //-----------------------------------------------------------------------------
- // FW_TObjectSafety Runtime Information
- //-----------------------------------------------------------------------------
- #pragma mark FW_TObjectSafety Runtime Information
-
- #ifdef FW_USE_TEMPLATE_PRAGMAS
- #pragma template_access public
- #pragma template FW_TObjectSafety<FW_CThread>
- #pragma template FW_TObjectSafety<FW_CCyberdogHelper>
- #endif
-
- FW_DEFINE_AUTO_TEMPLATE (FW_TObjectSafety, FW_CThread)
- FW_DEFINE_AUTO_TEMPLATE (FW_TObjectSafety, FW_CCyberdogHelper)
-
- #pragma mark -
- //========================================================================================
- // Callback Prototypes
- //========================================================================================
- #pragma mark Callback Prototypes
-
- /*
- We fill in a struct with pointers to these functions, and pass it to the
- extension. When it calls them, it passes in a pointer to that struct.
- We've subclassed the struct, so we just cast it to a pointer
- to our real C++ classes, and call equivalent virtual methods for
- each function.
- */
-
- void FW_CallbackOpenCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*, ODPart*, ParameterSet*);
- void FW_CallbackSetCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*, ParameterSet*);
- ODBoolean FW_CallbackCanShowCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*);
- void FW_CallbackShowCyberItem (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*);
- ODWindow* FW_CallbackGetCyberItemWindow (Environment*, FW_SCyberPartExtensionCallbacks*, CyberItem*);
- ODBoolean FW_CallbackIsCyberItemSelected (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*);
- void FW_CallbackAcquireSelectedCyberItems (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*, CyberItemList*);
- ODBoolean FW_CallbackIsURLSelected (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*);
- void FW_CallbackGetSelectedURL (Environment*, FW_SCyberPartExtensionCallbacks*, ODFrame*, FW_CString& url);
- ODBoolean FW_CallbackHandleCommand (Environment*, FW_SCyberPartExtensionCallbacks*, long, long, ODFrame*, somToken);
-
- #pragma mark -
- //========================================================================================
- // SOM Utilities
- //========================================================================================
- #pragma mark SOM Utilities
-
- /*
- Since we have a SOM interface, we have to make sure we don't try to
- throw any C++ exceptions out of here; we need to catch them and convert
- them into SOM exceptions.
- */
-
- static const char FW_kInvalidException[] = "Unknown Exception!";
-
- #define FW_SOM_CALLBACK_TRY \
- FW_TRY \
- {
-
- #define FW_SOM_CALLBACK_ENDTRY \
- } \
- FW_CATCH_BEGIN \
- FW_CATCH_REFERENCE(FW_XException, exception)\
- { \
- FW_SetException(ev, exception);\
- } \
- FW_CATCH_EVERYTHING() \
- { \
- FW_DEBUG_MESSAGE(FW_kInvalidException);\
- FW_SetEvError(ev, kODErrUndefined);\
- } \
- FW_CATCH_END
-
- #pragma mark -
- //-----------------------------------------------------------------------------
- // FW_SupportCyberdogIfPresent
- //-----------------------------------------------------------------------------
-
- FW_CCyberdogHelper* FW_SupportCyberdogIfPresent (Environment* ev, FW_CPart* part, FW_Boolean cymenus, ODCommandID cybase, FW_Boolean cynav)
- {
- if (!FW_CyberdogIsInstalled (ev))
- return kODNULL;
-
- FW_CCyberdogHelper* helper = FW_NEW (FW_CCyberdogHelper, (part));
- FW_TObjectSafety<FW_CCyberdogHelper> helperSafety (helper);
- helper->Initialize (ev, cymenus, cybase, cynav);
- part->AdoptEventHandler (ev, helper);
- helperSafety.Release();
- return helper;
- }
-
- #pragma mark -
- //========================================================================================
- // Class FW_CCyberdogHelper
- //========================================================================================
- #pragma mark Class FW_CCyberdogHelper
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper Globals
- //-----------------------------------------------------------------------------
-
- RoutineDescriptor FW_kCyberAbortTaskUPP = BUILD_ROUTINE_DESCRIPTOR (uppCyberAbortProcInfo, FW_CCyberdogHelper::PrivCyberAbort);
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper Runtime Information
- //-----------------------------------------------------------------------------
- #pragma mark FW_CCyberdogHelper Runtime Information
-
- FW_DEFINE_AUTO (FW_CCyberdogHelper)
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::FW_CCyberdogHelper
- //-----------------------------------------------------------------------------
-
- FW_CCyberdogHelper::FW_CCyberdogHelper (FW_CPart* part)
- : FW_CCyberdogCallbacks (part)
- , fCyberServiceMenu (kODNULL)
- , fUseNavigator (false)
- , fCyberdogMenuHandle (kODNULL)
- , fLoadCyberItemThreadProcedure (0)
- , fLoadCyberItemThreadParameters (0)
- {
- FW_END_CONSTRUCTOR
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::~FW_CCyberdogHelper
- //-----------------------------------------------------------------------------
-
- FW_CCyberdogHelper::~FW_CCyberdogHelper ()
- {
- FW_START_DESTRUCTOR
-
- //
- // Menu Support
- //
-
- if (fCyberdogMenuHandle)
- ::DisposeHandle (fCyberdogMenuHandle);
- delete fCyberServiceMenu;
-
- //
- // Thread Support
- //
-
- FW_CThreadsCollectionIterator threads (&fThreads);
- for (FW_CThread* task = threads.First(); threads.IsNotComplete(); task = threads.Next() )
- delete task;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::Initialize
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogHelper::Initialize (Environment* ev, FW_Boolean cymenus, ODCommandID cybase, FW_Boolean cynav)
- {
- FW_CCyberdogCallbacks::Initialize (ev);
-
- FW_CPart* part = GetPart();
-
- // Even if we don't want the Cyberdog service menus, we should use the Cyberdog Document
- // menu if we are in the memory draft. We don't need to check; Install... does.
- FW_TAcquiredODRefCntObject<ODMenuBar> menus = part->GetMenuBar(ev)->AcquireODMenuBar(ev);
- fCyberdogMenuHandle = GetCyberSession (ev)->InstallCyberDocumentMenu (ev, part->GetODPart(ev), menus);
-
- // Cyberdog service menus take up lots of space and aren't always desirable.
- if (cymenus) {
- fCyberCommands = cybase;
- fCyberServiceMenu = new CyberServiceMenu;
- fCyberServiceMenu->ICyberServiceMenu (ev, menus, part->GetODPart(ev), cybase);
- }
-
- // Ok, do we want to show up in a navigator part?
- if (cynav)
- fUseNavigator = true;
- }
-
- /*
- Threads Support
- */
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::SetLoadCyberItemThreadProcedure
- //-----------------------------------------------------------------------------
-
- void
- FW_CCyberdogHelper::SetLoadCyberItemThreadProcedure (FW_ThreadProcedure loadCyberItem, void* parameters)
- {
- // See DoSetCyberItem
- fLoadCyberItemThreadProcedure = loadCyberItem;
- fLoadCyberItemThreadParameters = parameters;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::DoSetCyberItem
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogHelper::DoSetCyberItem (Environment* ev, CyberItem* newItem, ParameterSet* parameters)
- {
- FW_UNUSED (ev);
- FW_UNUSED (newItem);
- FW_UNUSED (parameters);
-
- // Should be customized by Developer
- // Must call inherited (done in extension)
-
- // mlanett 6/21/96 Threads Support
- // Now you can install a callback function and when Cyberdog wants
- // you to load something, the framework will create a thread and run the
- // function. Allows you to do the standard customization of FW_CCyberdogHelper
- // without having to subclass it or mix it into your part.
- if (fLoadCyberItemThreadProcedure) {
- FW_CThread* task = new FW_CThread (fLoadCyberItemThreadParameters, fLoadCyberItemThreadProcedure);
- FW_TObjectSafety<FW_CThread> taskSafety (task);
- fThreads.AddLast (task);
- taskSafety.Release();
- }
- else
- FW_ASSERT (("FW_CCyberdogHelper::DoSetCyberItem - you should either install a callback or override!", false));
- }
-
- /*
- CloseCyberDraftWindow & Cyberdog Menus Support
- */
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::DoMenu
- //-----------------------------------------------------------------------------
-
- FW_Handled FW_CCyberdogHelper::DoMenu (Environment* ev, const FW_CMenuEvent& event)
- {
- ODBoolean handled = FALSE;
- ODCommandID id = event.GetCommandID(ev);
-
- FW_CPart* part = GetPart();
- ODPart* odpart = part->GetODPart (ev);
- FW_CFrame* probableFrame = part->GetLastActiveFrame(ev); // XXX really really need to get the proper frame!
-
- if (fCyberServiceMenu && (fCyberCommands <= id) && (id < (fCyberCommands+1000)))
- handled = fCyberServiceMenu->DoCommand (ev, event.GetCommandID(ev), probableFrame->GetODFrame(ev));
-
- if (!handled && id == kODCommandClose && probableFrame->IsRoot(ev)) {
- /* FW_CWindow* window = frame->GetWindow(ev);*/
- /*if (!window->IsFloating())*/ {
- CyberSession* cyberSession = GetExtension (ev)->GetCyberSession (ev);
- handled = cyberSession->CloseCyberDraftWindow (ev, odpart);
- }
- }
-
- return handled ? FW_kHandled : FW_kNotHandled;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::DoAdjustMenus
- //-----------------------------------------------------------------------------
-
- FW_Handled FW_CCyberdogHelper::DoAdjustMenus (Environment* ev, FW_CMenuBar* menuBar, FW_Boolean hasMenuFocus, FW_Boolean isRoot)
- {
- FW_UNUSED (menuBar);
- FW_UNUSED (isRoot);
-
- // Damnit, the frame isn't passed in here.
- // Hopefully ActiveFrame will be the frame with the menu focus.
- if (hasMenuFocus && fCyberServiceMenu) {
- FW_CPart* part = GetPart();
- FW_CFrame* probableFrame = part->GetLastActiveFrame(ev);
- fCyberServiceMenu->Adjust (ev, probableFrame->GetODFrame(ev));
- }
-
- return FW_kNotHandled;
- }
-
- /*
- CyberItem Utilities
- */
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::GetCyberItem
- //-----------------------------------------------------------------------------
-
- CyberItem*
- FW_CCyberdogHelper::GetCyberItem (Environment* ev)
- {
- return GetExtension (ev)->GetCyberItem (ev);
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::GetCyberSession
- //-----------------------------------------------------------------------------
-
- CyberSession*
- FW_CCyberdogHelper::GetCyberSession (Environment* ev)
- {
- // Having a CyberSession is equivalent to having the extension.
- CyberPartExtension* extension = GetExtension(ev);
- return extension?
- extension->GetCyberSession (ev):
- ::GetCyberSession(ev); // XXX CD bug sometimes returns null
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::InternalizeCyberItem
- //-----------------------------------------------------------------------------
-
- CyberItem*
- FW_CCyberdogHelper::InternalizeCyberItem (Environment* ev, FW_OSink* sink, Boolean reload)
- {
- // Cyberdog must be installed. If Cyberdog is not loaded, it will be.
- CyberItem* ci = kODNULL;
-
- ci = FW_ReadCyberItem (ev, GetCyberSession (ev), sink);
- if (reload)
- GetExtension (ev)->SetCyberItem (ev, ci, kODNULL);
-
- return ci;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::ExternalizeCurrentCyberItem
- //-----------------------------------------------------------------------------
-
- void
- FW_CCyberdogHelper::ExternalizeCurrentCyberItem (Environment* ev, FW_OSink* sink)
- {
- CyberItem* ci = GetCyberItem (ev);
- if (ci) {
- FW_WriteCyberItem (ev, ci, sink);
- }
- }
-
- /*
- Navigator support
- */
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::HandleOpenCyberItem
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogHelper::HandleOpenCyberItem (Environment* ev, CyberItem* item, ODPart* openerPart, ParameterSet* parameters)
- {
- // By default call the default ("inherited") OpenCyberItem in CyberPartExtension.
- if (!fUseNavigator) {
- FW_CCyberdogCallbacks::HandleOpenCyberItem (ev, item, openerPart, parameters);
- return;
- }
-
- // OpenCyberItem by default opens a little progress window and then our
- // part by itself. We want to show up in a browser ("Navigator"); this will
- // require us to replace this method.
-
- GetExtension (ev)->SetCyberItem (ev, item, parameters);
- // The extension will call our DoSetCyberItem and we will...
- // 1) hook up the progress bar
- // 2) start reading the data from the network
-
- // Now then, are we already in a navigator part ("browsing in place") or do
- // we need to create one?
-
- FW_TAcquiredODRefCntObject<ODPart> navigator;
- if (openerPart && openerPart->HasExtension (ev, kCyberNavigatorExtension)) {
- // FW_TAcquiredODRefCntObject does not acquire its objects; it only releases them.
- // Normally acquisition is performed by the accessor function but in this case
- // openerPart was passed in to us.
- openerPart->Acquire(ev);
- navigator = openerPart;
- }
- else {
- navigator = GetCyberSession(ev)->CreateCyberPart (ev, openerPart, kNavigatorKind, kODNULL);
- if (openerPart && openerPart->HasExtension (ev, kCyberOpenerPartExtension)) {
- FW_TAcquiredODRefCntObject<CyberOpenerPartExtension> cope = (CyberOpenerPartExtension*) openerPart->AcquireExtension (ev, kCyberOpenerPartExtension);
- cope->OpenPart (ev, item, navigator, parameters);
- }
- else
- navigator->Open (ev, kODNULL);
- }
-
- // Finally make sure the navigator displays us (navigators have lots of
- // parts but only show one at a time in their frames).
-
- if (navigator->HasExtension (ev, kCyberNavigatorExtension)) {
- FW_CPart* part = GetPart();
- FW_TAcquiredODRefCntObject<CyberNavigatorExtension> nave = (CyberNavigatorExtension*) navigator->AcquireExtension (ev, kCyberNavigatorExtension);
- nave->GoToCyberItem (ev, item, part->GetODPart(ev), parameters);
- }
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::AcquireContainingNavigator
- //-----------------------------------------------------------------------------
-
- ODPart* FW_CCyberdogHelper::AcquireContainingNavigator (Environment* ev)
- {
- CyberSession* session = GetCyberSession (ev);
- if (!session)
- return kODNULL;
-
- // It's remotely possible to be embedded in multiple navigators, but they
- // would all be the same, so it's not a problem. Just find the first navigator
- // containing a frame.
-
- FW_CPart* part = GetPart();
- FW_CFrame* probableFrame = part->GetLastActiveFrame(ev);
- if (!probableFrame)
- return kODNULL;
- FW_CPresentationFrameIterator fiter (ev, probableFrame->GetPresentation (ev));
- for (FW_CFrame* f = fiter.First(ev); fiter.IsNotComplete(ev); f = fiter.Next(ev)) {
- ODPart* navigator = session->AcquireContainingNavigatorPart (ev, f->GetODFrame(ev));
- if (navigator)
- return navigator;
- }
-
- return kODNULL;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::MakeCyberProgressBroadcaster
- //-----------------------------------------------------------------------------
-
- CyberProgressBroadcaster* FW_CCyberdogHelper::MakeCyberProgressBroadcaster (Environment* ev, short mode)
- {
- CyberProgressBroadcaster* broadcaster = new CyberProgressBroadcaster;
- broadcaster->ICyberProgressBroadcaster (ev, &FW_kCyberAbortTaskUPP, (Ptr)this);
- // kUnmeteredProgress
- broadcaster->SetProgressMode(ev, mode);
- return broadcaster;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::DoCyberAbort
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogHelper::DoCyberAbort (Environment* ev, CyberProgressBroadcaster* broadcaster)
- {
- FW_UNUSED (ev);
-
- delete broadcaster;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogHelper::PrivCyberAbort
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogHelper::PrivCyberAbort (CDAbortProcMessage message, CyberProgressBroadcaster* broadcaster, Ptr selfPtr)
- {
- FW_SOMEnvironment ev;
- FW_CCyberdogHelper* self = (FW_CCyberdogHelper*) selfPtr;
-
- switch (message) {
- case kAbortMessage:
- self->DoCyberAbort (ev, broadcaster);
- break;
- default:
- break;
- }
- }
-
- #pragma mark -
- //========================================================================================
- // Class FW_CCyberdogCallbacks
- //========================================================================================
- #pragma mark Class FW_CCyberdogCallbacks
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks Globals
- //-----------------------------------------------------------------------------
-
- FW_DEFINE_AUTO (FW_CCyberdogCallbacks)
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::FW_CCyberdogCallbacks
- //-----------------------------------------------------------------------------
-
- FW_CCyberdogCallbacks::FW_CCyberdogCallbacks (FW_CPart* part)
- : fPart (part)
- , fExtension (0)
- {
- openCyberItem = &FW_CallbackOpenCyberItem;
- setCyberItem = &FW_CallbackSetCyberItem;
- canShowCyberItem = &FW_CallbackCanShowCyberItem;
- showCyberItem = &FW_CallbackShowCyberItem;
- getCyberItemWindow = &FW_CallbackGetCyberItemWindow;
- isCyberItemSelected = &FW_CallbackIsCyberItemSelected;
- acquireSelectedCyberItems = &FW_CallbackAcquireSelectedCyberItems;
- isURLSelected = &FW_CallbackIsURLSelected;
- getSelectedURL = &FW_CallbackGetSelectedURL;
- handleCommand = &FW_CallbackHandleCommand;
-
- FW_END_CONSTRUCTOR
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::~FW_CCyberdogCallbacks
- //-----------------------------------------------------------------------------
-
- FW_CCyberdogCallbacks::~FW_CCyberdogCallbacks ()
- {
- FW_START_DESTRUCTOR
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::Initialize
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogCallbacks::Initialize (Environment* ev)
- {
- // Register our extension
- FW_CExtensionManager* manager = fPart->GetExtensionManager(ev);
- FW_ASSERT (manager);
- manager->RegisterExtension (ev, kCyberPartExtension, &CreateCyberExtension, this, FALSE);
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::GetExtension
- //-----------------------------------------------------------------------------
-
- CyberPartExtension* FW_CCyberdogCallbacks::GetExtension (Environment* ev)
- {
- // Possibilities:
- // (a) We don't have Cyberdog installed. In that case this object should
- // not be created in the first place: if (FW_HasCyberdog()) { // create
- // (b) Have Cyberdog but we don't want its menus or navigator and it
- // hasn't invoked us (i.e. we are a normal part).
- // (c) Have Cyberdog and have its menus or other such.
-
- // We don't want to load Cyberdog if it's not necessary. Cyberdog will be loaded if:
- // (a) We use Cyberdog menus or the navigator
- // (b) We call GetExtension()
- // (c) Cyberdog calls us.
-
- // To avoid loading Cyberdog (if it's not loaded and you don't NEED it),
- // call CyberdogIsLoaded.
-
- FW_Boolean create = true;
- FW_CAcquiredODFCyberPartExtension extension = (ODF_FW_OCyberPartExtension*) fPart->GetExtensionManager(ev)->AcquireExtension (ev, kCyberPartExtension, create);
- return extension;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::CyberdogIsLoaded
- //-----------------------------------------------------------------------------
-
- FW_Boolean FW_CCyberdogCallbacks::CyberdogIsLoaded (Environment* ev)
- {
- FW_Boolean create = false;
- FW_CAcquiredODFCyberPartExtension extension = (ODF_FW_OCyberPartExtension*) fPart->GetExtensionManager(ev)->AcquireExtension (ev, kCyberPartExtension, create);
- return extension != kODNULL;
- }
-
- /*
- Cyberdog Callbacks
- */
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::HandleOpenCyberItem
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogCallbacks::HandleOpenCyberItem (Environment* ev, CyberItem* item, ODPart* openerPart, ParameterSet* parameters)
- {
- // By default call the default ("inherited") OpenCyberItem in CyberPartExtension.
- fExtension->DefaultOpenCyberItem (ev, item, openerPart, parameters);
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoSetCyberItem
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogCallbacks::DoSetCyberItem (Environment* ev, CyberItem* newItem, ParameterSet* parameters)
- {
- FW_UNUSED (ev);
- FW_UNUSED (newItem);
- FW_UNUSED (parameters);
-
- // Should be customized by Developer
- // Must call inherited (done in extension)
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoCanShowCyberItem
- //-----------------------------------------------------------------------------
-
- ODBoolean FW_CCyberdogCallbacks::DoCanShowCyberItem (Environment* ev, CyberItem* item)
- {
- FW_UNUSED (ev);
- FW_UNUSED (item);
-
- // This is a test for equality (not identity). If you are showing
- // some variant of the given item, return true. For example,
- // http://Where/ is similar to http://Where/index.html
- // Also, http://Here#Bookmark is similar to http://Here
- // You don't need to test for identity; it's been handled already.
-
- return FALSE;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoShowCyberItem
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogCallbacks::DoShowCyberItem (Environment* ev, CyberItem* item)
- {
- FW_UNUSED (ev);
- FW_UNUSED (item);
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoGetCyberItemWindow
- //-----------------------------------------------------------------------------
-
- ODWindow* FW_CCyberdogCallbacks::DoGetCyberItemWindow (Environment* ev, CyberItem* item)
- {
- FW_UNUSED (item);
-
- // I think this API is a Cyberdog bug: it is not acquiring the window!
- // This is not properly thread-safe.
-
- FW_CFrame* probableFrame = fPart->GetLastActiveFrame (ev);
- if (probableFrame) {
- FW_TAcquiredODRefCntObject<ODWindow> theWindow = probableFrame->AcquireODWindow (ev);
- return theWindow;
- }
-
- return kODNULL;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoIsCyberItemSelected
- //-----------------------------------------------------------------------------
-
- ODBoolean FW_CCyberdogCallbacks::DoIsCyberItemSelected (Environment* ev, ODFrame* frame)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
-
- return FALSE;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoAcquireSelectedCyberItems
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogCallbacks::DoAcquireSelectedCyberItems (Environment* ev, ODFrame* frame, CyberItemList* items)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
- FW_UNUSED (items);
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoIsURLSelected
- //-----------------------------------------------------------------------------
-
- ODBoolean FW_CCyberdogCallbacks::DoIsURLSelected (Environment* ev, ODFrame* frame)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
-
- return FALSE;
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::DoGetSelectedURL
- //-----------------------------------------------------------------------------
-
- void FW_CCyberdogCallbacks::DoGetSelectedURL (Environment* ev, ODFrame* frame, FW_CString & url)
- {
- FW_UNUSED (ev);
- FW_UNUSED (frame);
-
- url = "";
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::HandleCyberCommand
- //-----------------------------------------------------------------------------
-
- ODBoolean FW_CCyberdogCallbacks::HandleCyberCommand (Environment* ev, long commandSuite, long command, ODFrame* frame, somToken parameters)
- {
- // By default call the default ("inherited") HandleCommand in CyberPartExtension.
- return fExtension->DefaultHandleCommand (ev, commandSuite, command, frame, parameters);
- }
-
- //-----------------------------------------------------------------------------
- // FW_CCyberdogCallbacks::CreateCyberExtension
- //-----------------------------------------------------------------------------
-
- ODExtension* FW_CCyberdogCallbacks::CreateCyberExtension (Environment* ev, FW_CPart* part, const char* name, void* selfCallbacks)
- {
- FW_UNUSED (name);
-
- FW_CCyberdogCallbacks* self = (FW_CCyberdogCallbacks*) selfCallbacks;
-
- ODPart* odpart = part->GetODPart(ev);
- ODF_FW_OCyberPartExtension* cyberPartExtension = new ODF_FW_OCyberPartExtension;
- cyberPartExtension->ICyberPartExtension (ev, odpart);
- cyberPartExtension->SetCallbacks (ev, self);
-
- // This is a bit odd. Basically a Cyberdog part has to be a client of its own extension,
- // because that's the only way to talk to Cyberdog. Therefore once we create the
- // extension, we don't let it go. Hence the unbalanced Acquire.
- cyberPartExtension->Acquire(ev);
- self->fExtension = cyberPartExtension;
-
- return cyberPartExtension;
- }
-
- #pragma mark -
- //========================================================================================
- // Callbacks
- //========================================================================================
- #pragma mark Callbacks
-
- //----------------------------------------------------------------------------------------
- // Callback Utilities
- //----------------------------------------------------------------------------------------
-
- // Should I use RTTI here? Hardly seems necessary.
- #define FINDSELF(SELF,CALLBACKS) FW_CCyberdogCallbacks* SELF = \
- (FW_CCyberdogCallbacks*) CALLBACKS
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackOpenCyberItem
- //----------------------------------------------------------------------------------------
-
- void FW_CallbackOpenCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item, ODPart* openerPart, ParameterSet* data)
- {
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- self->HandleOpenCyberItem (ev, item, openerPart, data);
- FW_SOM_CALLBACK_ENDTRY
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackSetCyberItem
- //----------------------------------------------------------------------------------------
-
- void FW_CallbackSetCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item, ParameterSet* data)
- {
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- self->DoSetCyberItem (ev, item, data);
- FW_SOM_CALLBACK_ENDTRY
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackCanShowCyberItem
- //----------------------------------------------------------------------------------------
-
- ODBoolean FW_CallbackCanShowCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item)
- {
- ODBoolean similar = false;
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- similar = self->DoCanShowCyberItem (ev, item);
- FW_SOM_CALLBACK_ENDTRY
-
- return similar;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackShowCyberItem
- //----------------------------------------------------------------------------------------
-
- void FW_CallbackShowCyberItem (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item)
- {
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- self->DoShowCyberItem (ev, item);
- FW_SOM_CALLBACK_ENDTRY
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackGetCyberItemWindow
- //----------------------------------------------------------------------------------------
-
- ODWindow* FW_CallbackGetCyberItemWindow (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, CyberItem* item)
- {
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- return self->DoGetCyberItemWindow (ev, item);
- FW_SOM_CALLBACK_ENDTRY
-
- return NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackIsCyberItemSelected
- //----------------------------------------------------------------------------------------
-
- ODBoolean FW_CallbackIsCyberItemSelected (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame)
- {
- ODBoolean selected = false;
-
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- selected = self->DoIsCyberItemSelected (ev, frame);
- FW_SOM_CALLBACK_ENDTRY
-
- return selected;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackAcquireSelectedCyberItems
- //----------------------------------------------------------------------------------------
-
- void FW_CallbackAcquireSelectedCyberItems (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame, CyberItemList* list)
- {
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- self->DoAcquireSelectedCyberItems (ev, frame, list);
- FW_SOM_CALLBACK_ENDTRY
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackIsURLSelected
- //----------------------------------------------------------------------------------------
-
- ODBoolean FW_CallbackIsURLSelected (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame)
- {
- ODBoolean selected = false;
-
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- selected = self->DoIsURLSelected (ev, frame);
- FW_SOM_CALLBACK_ENDTRY
-
- return selected;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackGetSelectedURL
- //----------------------------------------------------------------------------------------
-
- void FW_CallbackGetSelectedURL (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, ODFrame* frame, FW_CString& url)
- {
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- self->DoGetSelectedURL (ev, frame, url);
- #if 0
- // all this has been moved into SLCyPart.cpp
- int length = url.GetByteLength();
- if (length == 0)
- return NULL;
- corbastring curl = (corbastring) SOMMalloc (length + 1);
- if (!curl)
- FW_Failure(FW_xMemoryExhausted);
- strcpy (curl, url);
- return curl;
- #endif
- FW_SOM_CALLBACK_ENDTRY
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CallbackHandleCommand
- //----------------------------------------------------------------------------------------
-
- ODBoolean FW_CallbackHandleCommand (Environment* ev, FW_SCyberPartExtensionCallbacks* callbacks, long commandSuite, long command, ODFrame* frame, somToken parameters)
- {
- ODBoolean handled = false;
-
- FW_SOM_CALLBACK_TRY
- FINDSELF(self,callbacks);
- handled = self->HandleCyberCommand (ev, commandSuite, command, frame, parameters);
- FW_SOM_CALLBACK_ENDTRY
-
- return handled;
- }
-
-