/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef SD_FRAMEWORK_FRAMEWORK_HELPER_HXX #define SD_FRAMEWORK_FRAMEWORK_HELPER_HXX #include "ViewShell.hxx" #include "tools/SdGlobalResourceContainer.hxx" #include #include #include #include #include #include #include #include namespace sd { class ViewShell; class ViewShellBase; } namespace rtl { class OUString; } namespace css = ::com::sun::star; namespace cssu = ::com::sun::star::uno; namespace cssdf = ::com::sun::star::drawing::framework; namespace sd { namespace framework { /** The FrameworkHelper is a convenience class that simplifies the access to the drawing framework. It has three main tasks: 1. Provide frequently used strings of resource URLs and event names. 2. Provide shortcuts for accessing the sd framework. 3. Ease the migration to the drawing framwork. Note that a FrameworkHelper disposes itself when one of the resource controllers called by it throws a DisposedException. */ class FrameworkHelper : public ::boost::enable_shared_from_this, public SdGlobalResource { public: // URLs of frequently used panes. static const ::rtl::OUString msPaneURLPrefix; static const ::rtl::OUString msCenterPaneURL; static const ::rtl::OUString msFullScreenPaneURL; static const ::rtl::OUString msLeftImpressPaneURL; static const ::rtl::OUString msLeftDrawPaneURL; static const ::rtl::OUString msSidebarPaneURL; // URLs of frequently used views. static const ::rtl::OUString msViewURLPrefix; static const ::rtl::OUString msImpressViewURL; static const ::rtl::OUString msDrawViewURL; static const ::rtl::OUString msOutlineViewURL; static const ::rtl::OUString msNotesViewURL; static const ::rtl::OUString msHandoutViewURL; static const ::rtl::OUString msSlideSorterURL; static const ::rtl::OUString msPresentationViewURL; static const ::rtl::OUString msSidebarViewURL; // URLs of frequently used tool bars. static const ::rtl::OUString msToolBarURLPrefix; static const ::rtl::OUString msViewTabBarURL; // URLs of task panels. static const ::rtl::OUString msTaskPanelURLPrefix; static const ::rtl::OUString msAllMasterPagesTaskPanelURL; static const ::rtl::OUString msRecentMasterPagesTaskPanelURL; static const ::rtl::OUString msUsedMasterPagesTaskPanelURL; static const ::rtl::OUString msLayoutTaskPanelURL; static const ::rtl::OUString msTableDesignPanelURL; static const ::rtl::OUString msCustomAnimationTaskPanelURL; static const ::rtl::OUString msSlideTransitionTaskPanelURL; // Names of frequently used events. static const ::rtl::OUString msResourceActivationRequestEvent; static const ::rtl::OUString msResourceDeactivationRequestEvent; static const ::rtl::OUString msResourceActivationEvent; static const ::rtl::OUString msResourceDeactivationEvent; static const ::rtl::OUString msResourceDeactivationEndEvent; static const ::rtl::OUString msConfigurationUpdateStartEvent; static const ::rtl::OUString msConfigurationUpdateEndEvent; // Service names of the common controllers. static const ::rtl::OUString msModuleControllerService; static const ::rtl::OUString msConfigurationControllerService; /** Return the FrameworkHelper object that is associated with the given ViewShellBase. If such an object does not yet exist, a new one is created. */ static ::boost::shared_ptr Instance (ViewShellBase& rBase); static ::boost::shared_ptr Instance ( const cssu::Reference& rxController); /** Mark the FrameworkHelper object for the given ViewShellBase as disposed. A following ReleaseInstance() call will destroy the FrameworkHelper object. Do not call this method. It is an internally used method that can not be made private. */ static void DisposeInstance (ViewShellBase& rBase); /** Destroy the FrameworkHelper object for the given ViewShellBase. Do not call this method. It is an internally used method that can not be made private. */ static void ReleaseInstance (ViewShellBase& rBase); /** Return an identifier for the given view URL. This identifier can be used in a switch statement. See GetViewURL() for a mapping in the opposite direction. */ static ViewShell::ShellType GetViewId (const rtl::OUString& rsViewURL); /** Return a view URL for the given identifier. See GetViewId() for a mapping in the opposite direction. */ static ::rtl::OUString GetViewURL (ViewShell::ShellType eType); /** Return a ViewShell pointer for the given XView reference. This assumes that the given reference is implemented by the ViewShellWrapper class that supports the XTunnel interface. @return When the ViewShell pointer can not be inferred from the given reference then an empty pointer is returned. */ static ::boost::shared_ptr GetViewShell ( const cssu::Reference& rxView); typedef ::boost::function ConfigurationChangeEventFilter; typedef ::boost::function Callback; typedef ::boost::function< void( const cssu::Reference< cssdf::XResourceId>&) > ResourceFunctor; /** Test whether the called FrameworkHelper object is valid. @return When the object has already been disposed then is returned. */ bool IsValid (void); /** Return a pointer to the view shell that is displayed in the specified pane. See GetView() for a variant that returns a reference to XView instead of a ViewShell pointer. @return An empty pointer is returned when for example the specified pane does not exist or is not visible or does not show a view or one of the involved objects does not support XUnoTunnel (where necessary). */ ::boost::shared_ptr GetViewShell (const ::rtl::OUString& rsPaneURL); /** Return a reference to the view that is displayed in the specified pane. See GetViewShell () for a variant that returns a ViewShell pointer instead of a reference to XView. @param rxPaneOrViewId When this ResourceId specifies a view then that view is returned. When it belongs to a pane then one view in that pane is returned. @return An empty reference is returned when for example the specified pane does not exist or is not visible or does not show a view or one of the involved objects does not support XTunnel (where necessary). */ cssu::Reference GetView ( const cssu::Reference& rxPaneOrViewId); /** Return the XWindow that is represented by the pane with the given resource id. */ cssu::Reference GetPaneWindow ( const cssu::Reference& rxPaneId); /** Return the XResource object with the given resource id. */ cssu::Reference GetResource ( const cssu::Reference& rxResourceId); /** Request the specified view to be displayed in the specified pane. When the pane is not visible its creation is also requested. The update that creates the actual view object is done asynchronously. @param rsResourceURL The resource URL of the view to show. @param rsAnchorURL The URL of the pane in which to show the view. @return The resource id of the requested view is returned. With that the caller can, for example, call RunOnResourceActivation() to do some initialization after the requested view becomes active. */ cssu::Reference RequestView ( const ::rtl::OUString& rsResourceURL, const ::rtl::OUString& rsAnchorURL); /** Request the deactivation of the specified resource. */ void RequestResourceDeactivation ( const cssu::Reference& rxResourceId); /** Process a slot call that requests a view shell change. */ void HandleModeChangeSlot ( sal_uLong nSlotId, SfxRequest& rRequest); /** Run the given callback when the specified event is notified by the ConfigurationManager. When there are no pending requests and therefore no events would be notified (in the foreseeable future) then the callback is called immediately. The callback is called with a flag that tells the callback whether the event it waits for has been sent. */ void RunOnConfigurationEvent( const ::rtl::OUString& rsEventType, const Callback& rCallback); /** Run the given callback when the specified resource has been activated. When the resource is active already when this method is called then rCallback is called before this method returns. @param rxResourceId Wait for the activation of this resource before calling rCallback. @param rCallback The callback to be called when the resource is activated. */ void RunOnResourceActivation( const cssu::Reference& rxResourceId, const Callback& rCallback); /** Run the given callback when the specified resource has been deactivated. When the resource is not active already when this method is called then rCallback is called before this method returns. @param rxResourceId Wait for the deactivation of this resource before calling rCallback. @param rCallback The callback to be called when the resource is deactivated. @param bRunOnDeactivationEnd The callback is run either when the deactivation starts and the callback can still access the resource or when the deactivatio is complete and the resource is no longer available. */ void RunOnResourceDeactivation( const cssu::Reference& rxResourceId, const Callback& rCallback, const bool bRunOnDeactivationEnd); /** Normally the requested changes of the configuration are executed asynchronously. However, there is at least one situation (searching with the Outliner) where the surrounding code does not cope with this. So, instead of calling Reschedule until the global event loop executes the configuration update, this method does (almost) the same without the reschedules. Do not use this method until there is absolutely no other way. */ void RequestSynchronousUpdate (void); /** Block until the specified event is notified by the configuration controller. When the configuration controller is not processing any requests the method returns immediately. */ void WaitForEvent (const ::rtl::OUString& rsEventName) const; /** This is a short cut for WaitForEvent(msConfigurationUpdateEndEvent). Call this method to execute the pending requests. */ void WaitForUpdate (void) const; /** Explicit request for an update of the current configuration. Call this method when one of the resources managed by the sd framework has been activated or deactivated from the outside, i.e. not by the framework itself. An example for this is a click on the closer button of one of the side panes. */ void UpdateConfiguration (void); /** Return a string representation of the given XResourceId object. */ static ::rtl::OUString ResourceIdToString ( const cssu::Reference< cssdf::XResourceId>& rxResourceId); /** Create a new XResourceId object for the given resource URL. */ static cssu::Reference< cssdf::XResourceId> CreateResourceId ( const ::rtl::OUString& rsResourceURL); /** Create a new XResourceId object for the given resource URL and a single anchor URL. */ static cssu::Reference< cssdf::XResourceId> CreateResourceId ( const ::rtl::OUString& rsResourceURL, const ::rtl::OUString& rsAnchorURL); /** Create a new XResourceId object for the given resource URL and the two given anchor URLs. */ static cssu::Reference< cssdf::XResourceId> CreateResourceId ( const ::rtl::OUString& rsResourceURL, const ::rtl::OUString& rsFirstAnchorURL, const ::rtl::OUString& rsSecondAnchorURL); /** Create a new XResourceId object for the given resource URL. */ static cssu::Reference< cssdf::XResourceId> CreateResourceId ( const ::rtl::OUString& rsResourceURL, const cssu::Reference< cssdf::XResourceId>& rxAnchor); cssu::Reference GetConfigurationController (void) const; private: typedef ::std::map< ViewShellBase*, ::boost::shared_ptr > InstanceMap; /** The instance map holds (at least) one FrameworkHelper instance for every ViewShellBase object. */ static InstanceMap maInstanceMap; class ViewURLMap; static ::boost::scoped_ptr mpViewURLMap; ViewShellBase& mrBase; cssu::Reference mxConfigurationController; class DisposeListener; friend class DisposeListener; cssu::Reference mxDisposeListener; FrameworkHelper (ViewShellBase& rBase); FrameworkHelper (const FrameworkHelper& rHelper); // Not implemented. ~FrameworkHelper (void); class Deleter; friend class Deleter; FrameworkHelper& operator= (const FrameworkHelper& rHelper); // Not implemented. void Initialize (void); void Dispose (void); /** Run the given callback when an event of the specified type is received from the ConfigurationController or when the ConfigurationController has no pending change requests. @param rsEventType Run rCallback only on this event. @param rFilter This filter has to return in order for rCallback to be called. @param rCallback The callback functor to be called. */ void RunOnEvent( const ::rtl::OUString& rsEventType, const ConfigurationChangeEventFilter& rFilter, const Callback& rCallback) const; /** This disposing method is forwarded from the inner DisposeListener class. */ void disposing (const css::lang::EventObject& rEventObject); }; } } // end of namespace sd::framework namespace sd { namespace framework { namespace { class FrameworkHelperAllPassFilter { public: bool operator() (const cssdf::ConfigurationChangeEvent&) { return true; } }; class FrameworkHelperResourceIdFilter { public: FrameworkHelperResourceIdFilter ( const cssu::Reference& rxResourceId); bool operator() (const cssdf::ConfigurationChangeEvent& rEvent) { return mxResourceId.is() && rEvent.ResourceId.is() && mxResourceId->compareTo(rEvent.ResourceId) == 0; } private: cssu::Reference mxResourceId; }; } // end of anonymous namespace } } // end of namespace sd::framework #endif