diff options
Diffstat (limited to 'sfx2/source/sidebar/SidebarController.hxx')
-rw-r--r-- | sfx2/source/sidebar/SidebarController.hxx | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/sfx2/source/sidebar/SidebarController.hxx b/sfx2/source/sidebar/SidebarController.hxx index 2d2773690622..0aa088306ca5 100644 --- a/sfx2/source/sidebar/SidebarController.hxx +++ b/sfx2/source/sidebar/SidebarController.hxx @@ -29,12 +29,14 @@ #include <com/sun/star/awt/XWindowPeer.hpp> #include <com/sun/star/beans/XPropertyChangeListener.hpp> +#include <com/sun/star/frame/XDispatch.hpp> #include <com/sun/star/ui/XContextChangeEventListener.hpp> #include <com/sun/star/ui/XUIElement.hpp> #include <com/sun/star/ui/XSidebar.hpp> #include <boost/noncopyable.hpp> -#include <cppuhelper/compbase3.hxx> +#include <boost/optional.hpp> +#include <cppuhelper/compbase4.hxx> #include <cppuhelper/basemutex.hxx> namespace css = ::com::sun::star; @@ -43,13 +45,17 @@ namespace cssu = ::com::sun::star::uno; namespace { - typedef ::cppu::WeakComponentImplHelper3 < + typedef ::cppu::WeakComponentImplHelper4 < css::ui::XContextChangeEventListener, css::beans::XPropertyChangeListener, - css::ui::XSidebar + css::ui::XSidebar, + css::frame::XStatusListener > SidebarControllerInterfaceBase; } +class SfxSplitWindow; +class FixedBitmap; + namespace sfx2 { namespace sidebar { class ContentPanelDescriptor; @@ -82,6 +88,10 @@ public: virtual void SAL_CALL propertyChange (const css::beans::PropertyChangeEvent& rEvent) throw(cssu::RuntimeException); + // frame::XStatusListener + virtual void SAL_CALL statusChanged (const css::frame::FeatureStateEvent& rEvent) + throw(cssu::RuntimeException); + // ui::XSidebar virtual void SAL_CALL requestLayout (void) throw(cssu::RuntimeException); @@ -90,14 +100,16 @@ public: void SwitchToDeck ( const ::rtl::OUString& rsDeckId); + void OpenThenSwitchToDeck ( + const ::rtl::OUString& rsDeckId); /** Show only the tab bar, not the deck. */ - void CloseDeck (void); + void RequestCloseDeck (void); /** Open the deck area and restore the parent window to its old width. */ - void OpenDeck (void); + void RequestOpenDeck (void); FocusManager& GetFocusManager (void); @@ -112,12 +124,36 @@ private: ::rtl::OUString msCurrentDeckTitle; AsynchronousCall maPropertyChangeForwarder; AsynchronousCall maContextChangeUpdate; - bool mbIsDeckClosed; + + /** Two flags control whether the deck is displayed or if only the + tab bar remains visible. + The mbIsDeckOpen flag stores the current state while + mbIsDeckRequestedOpen stores how this state should be. User + actions like clicking on the deck closer affect the + mbIsDeckRequestedOpen. Normally both flags have the same + value. A document being read-only can prevent the deck from opening. + */ + ::boost::optional<bool> mbIsDeckRequestedOpen; + ::boost::optional<bool> mbIsDeckOpen; + bool mbCanDeckBeOpened; + /** Before the deck is closed the sidebar width is saved into this variable, so that it can be restored when the deck is reopended. */ sal_Int32 mnSavedSidebarWidth; FocusManager maFocusManager; + cssu::Reference<css::frame::XDispatch> mxReadOnlyModeDispatch; + bool mbIsDocumentReadOnly; + SfxSplitWindow* mpSplitWindow; + /** When the user moves the splitter then we remember the + width at that time. + */ + sal_Int32 mnWidthOnSplitterButtonDown; + /** Control that is temporarily used as replacement for the deck + to indicate that when the current mouse drag operation ends, the + sidebar will only show the tab bar. + */ + ::boost::scoped_ptr<Window> mpCloseIndicator; DECL_LINK(WindowEventHandler, VclWindowEvent*); /** Make maRequestedContext the current context. @@ -141,6 +177,8 @@ private: const ::std::vector<TabBar::DeckMenuData>& rDeckSelectionData, const ::std::vector<TabBar::DeckMenuData>& rDeckShowData) const; void ShowDetailMenu (const ::rtl::OUString& rsMenuCommand) const; + css::util::URL GetURL (const ::rtl::OUString& rsCommand) const; + cssu::Reference<css::frame::XDispatch> GetDispatch (const css::util::URL& rURL) const; ::boost::shared_ptr<PopupMenu> CreatePopupMenu ( const ::std::vector<TabBar::DeckMenuData>& rDeckSelectionData, const ::std::vector<TabBar::DeckMenuData>& rDeckShowData) const; @@ -151,21 +189,25 @@ private: That is only possible if there is no other docking window docked above or below the sidebar. Return whether the width of the child window can be modified. */ - bool CanModifyChildWindowWidth (void) const; + bool CanModifyChildWindowWidth (void); /** Set the child window container to a new width. Return the old width. */ sal_Int32 SetChildWindowWidth (const sal_Int32 nNewWidth); - void RestrictWidth (void); - /** Update the icons displayed in the title bars of the deck and the panels. This is called once when a deck is created and every time when a data change event is processed. */ void UpdateTitleBarIcons (void); + void UpdateDeckOpenState (void); + void RestrictWidth (void); + SfxSplitWindow* GetSplitWindow (void); + void ProcessNewWidth (const sal_Int32 nNewWidth); + void UpdateCloseIndicator (const bool bIsIndicatorVisible); + virtual void SAL_CALL disposing (void); }; |