diff options
author | Andre Fischer <af@apache.org> | 2013-06-05 15:40:56 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-09-20 16:35:29 +0100 |
commit | 50cbbc7f3afdd077e98f416f97390fe93428e8cf (patch) | |
tree | f1f0bdfa883202bd8fe382f8f99afda454c3e30e /sfx2/source/sidebar | |
parent | d023339c2f85555212bdb9804854dcc2c403b50e (diff) |
Resolves: #i122470# Fixed programmatic triggered switching of sidebar decks
(cherry picked from commit 7b26aba94e5544937f1e37e34915bcb276bc3c27)
Conflicts:
sd/sdi/sdraw.sdi
sd/source/ui/framework/tools/FrameworkHelper.cxx
sd/source/ui/inc/framework/FrameworkHelper.hxx
sd/source/ui/view/ViewShellBase.cxx
sd/source/ui/view/drviews6.cxx
sfx2/Package_inc.mk
sfx2/inc/sfx2/sidebar/Sidebar.hxx
Change-Id: Ic6b518e734fe59a7b713e85e934487347b847c5a
Diffstat (limited to 'sfx2/source/sidebar')
-rw-r--r-- | sfx2/source/sidebar/AsynchronousCall.cxx | 9 | ||||
-rw-r--r-- | sfx2/source/sidebar/AsynchronousCall.hxx | 1 | ||||
-rw-r--r-- | sfx2/source/sidebar/Sidebar.cxx | 66 | ||||
-rw-r--r-- | sfx2/source/sidebar/Sidebar.hxx | 67 | ||||
-rw-r--r-- | sfx2/source/sidebar/SidebarController.cxx | 66 | ||||
-rw-r--r-- | sfx2/source/sidebar/SidebarController.hxx | 23 | ||||
-rw-r--r-- | sfx2/source/sidebar/SidebarDockingWindow.hxx | 1 | ||||
-rw-r--r-- | sfx2/source/sidebar/TabBar.cxx | 12 |
8 files changed, 122 insertions, 123 deletions
diff --git a/sfx2/source/sidebar/AsynchronousCall.cxx b/sfx2/source/sidebar/AsynchronousCall.cxx index 9ccb20234b5e..2ce02dc81fff 100644 --- a/sfx2/source/sidebar/AsynchronousCall.cxx +++ b/sfx2/source/sidebar/AsynchronousCall.cxx @@ -23,6 +23,15 @@ namespace sfx2 { namespace sidebar { +AsynchronousCall::AsynchronousCall (void) + : maAction(), + mnCallId(0) +{ +} + + + + AsynchronousCall::AsynchronousCall (const Action& rAction) : maAction(rAction), mnCallId(0) diff --git a/sfx2/source/sidebar/AsynchronousCall.hxx b/sfx2/source/sidebar/AsynchronousCall.hxx index 7fad0c872954..440aca0f4dc3 100644 --- a/sfx2/source/sidebar/AsynchronousCall.hxx +++ b/sfx2/source/sidebar/AsynchronousCall.hxx @@ -32,6 +32,7 @@ class AsynchronousCall public: typedef ::boost::function<void(void)> Action; + AsynchronousCall (void); AsynchronousCall (const Action& rAction); ~AsynchronousCall (void); diff --git a/sfx2/source/sidebar/Sidebar.cxx b/sfx2/source/sidebar/Sidebar.cxx index 27518b9c64ff..dd7efec0550a 100644 --- a/sfx2/source/sidebar/Sidebar.cxx +++ b/sfx2/source/sidebar/Sidebar.cxx @@ -16,9 +16,9 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "precompiled_sfx2.hxx" -#include "Sidebar.hxx" +#include "sfx2/sidebar/Sidebar.hxx" +#include "SidebarController.hxx" #include "ResourceManager.hxx" using namespace css; @@ -26,55 +26,39 @@ using namespace cssu; namespace sfx2 { namespace sidebar { -Sidebar::Sidebar( - Window& rParentWindow, - const Reference<frame::XFrame>& rxDocumentFrame) - : Window(&rParentWindow, WB_DIALOGCONTROL) -{ - ContentPanelManager::Instance(); -} - - - - -Sidebar::~Sidebar (void) -{ -} - - - -void Sidebar::Resize (void) +void Sidebar::ShowPanel ( + const ::rtl::OUString& rsPanelId, + const Reference<frame::XFrame>& rxFrame) { - Window::Resize(); - // m_pImpl->OnResize(); -} - - - - -void Sidebar::GetFocus (void) -{ - Window::GetFocus(); - // m_pImpl->OnGetFocus(); + SidebarController* pController = SidebarController::GetSidebarControllerForFrame(rxFrame); + const PanelDescriptor* pPanelDescriptor = ResourceManager::Instance().GetPanelDescriptor(rsPanelId); + if (pController!=NULL && pPanelDescriptor != NULL) + { + // This should be a lot more sophisticated: + // - Make the deck switching asynchronous + // - Make sure that the panel is visible and expanded after + // the switch. + // - Make sure to use a context that really shows the panel + // + // All that is not necessary for the current use cases so lets + // keep it simple for the time being. + pController->RequestSwitchToDeck(pPanelDescriptor->msDeckId); + } } -void Sidebar::DataChanged (const DataChangedEvent& rDataChangedEvent) +void Sidebar::ShowDeck ( + const ::rtl::OUString& rsDeckId, + const Reference<frame::XFrame>& rxFrame) { - if (rDataChangedEvent.GetType() == DATACHANGED_SETTINGS - && (rDataChangedEvent.GetFlags() & SETTINGS_STYLE)!= 0) - { - Invalidate(); - } - else - Window::DataChanged(rDataChangedEvent); + SidebarController* pController = SidebarController::GetSidebarControllerForFrame(rxFrame); + if (pController != NULL) + pController->RequestSwitchToDeck(rsDeckId); } - - } } // end of namespace sfx2::sidebar /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/source/sidebar/Sidebar.hxx b/sfx2/source/sidebar/Sidebar.hxx deleted file mode 100644 index fee066294bfd..000000000000 --- a/sfx2/source/sidebar/Sidebar.hxx +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 . - */ -#ifndef SFX_SIDEBAR_HXX -#define SFX_SIDEBAR_HXX - -#include "sfx2/dllapi.h" -#include <vcl/window.hxx> -#include <com/sun/star/frame/XFrame.hpp> - - -namespace css = ::com::sun::star; -namespace cssu = ::com::sun::star::uno; - -namespace sfx2 { namespace sidebar { - - -/** SFX-less version of a module dependent task pane, filled with tool panels as specified in the respective - module's configuration -*/ -class SFX2_DLLPUBLIC Sidebar - : public Window -{ -public: - /** creates a new instance - @param i_rParentWindow - the parent window - @param i_rDocumentFrame - the frame to which the task pane belongs. Will be passed to any custom tool panels created - via an XUIElementFactory. Also, it is used to determine the module which the task pane is - responsible for, thus controlling which tool panels are actually available. - */ - Sidebar( - Window& rParentWindow, - const cssu::Reference<css::frame::XFrame>& rxDocumentFrame); - - - virtual ~Sidebar (void); - -protected: - virtual void Resize (void); - virtual void GetFocus (void); - -private: -}; - - -} } // end of namespace sfx2::sidebar - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 224295a4cce0..cdfa06cfd4af 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -75,6 +75,8 @@ namespace namespace sfx2 { namespace sidebar { +SidebarController::SidebarControllerContainer SidebarController::maSidebarControllerContainer; + namespace { enum MenuId { @@ -111,6 +113,7 @@ SidebarController::SidebarController ( msCurrentDeckTitle(), maPropertyChangeForwarder(::boost::bind(&SidebarController::BroadcastPropertyChange, this)), maContextChangeUpdate(::boost::bind(&SidebarController::UpdateConfigurations, this)), + maAsynchronousDeckSwitch(), mbIsDeckRequestedOpen(), mbIsDeckOpen(), mbCanDeckBeOpened(true), @@ -153,6 +156,12 @@ SidebarController::SidebarController ( mxReadOnlyModeDispatch->addStatusListener(this, aURL); SwitchToDeck(A2S("default")); + + WeakReference<SidebarController> xWeakController (this); + maSidebarControllerContainer.insert( + SidebarControllerContainer::value_type( + rxFrame, + xWeakController)); } @@ -165,8 +174,29 @@ SidebarController::~SidebarController (void) +SidebarController* SidebarController::GetSidebarControllerForFrame ( + const cssu::Reference<css::frame::XFrame>& rxFrame) +{ + SidebarControllerContainer::iterator iEntry (maSidebarControllerContainer.find(rxFrame)); + if (iEntry == maSidebarControllerContainer.end()) + return NULL; + + cssu::Reference<XInterface> xController (iEntry->second.get()); + if ( ! xController.is()) + return NULL; + + return dynamic_cast<SidebarController*>(xController.get()); +} + + + + void SAL_CALL SidebarController::disposing (void) { + SidebarControllerContainer::iterator iEntry (maSidebarControllerContainer.find(mxFrame)); + if (iEntry != maSidebarControllerContainer.end()) + maSidebarControllerContainer.erase(iEntry); + maFocusManager.Clear(); cssu::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer ( @@ -204,6 +234,7 @@ void SAL_CALL SidebarController::disposing (void) static_cast<css::beans::XPropertyChangeListener*>(this)); maContextChangeUpdate.CancelRequest(); + maAsynchronousDeckSwitch.CancelRequest(); } @@ -219,7 +250,10 @@ void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::Contex rEvent.ApplicationName, rEvent.ContextName); if (maRequestedContext != maCurrentContext) + { + maAsynchronousDeckSwitch.CancelRequest(); maContextChangeUpdate.RequestCall(); + } } @@ -262,6 +296,7 @@ void SAL_CALL SidebarController::statusChanged (const css::frame::FeatureStateEv if ( ! mbIsDocumentReadOnly) msCurrentDeckId = gsDefaultDeckId; mnRequestedForceFlags |= SwitchFlag_ForceSwitch; + maAsynchronousDeckSwitch.CancelRequest(); maContextChangeUpdate.RequestCall(); } } @@ -440,16 +475,6 @@ void SidebarController::UpdateConfigurations (void) SwitchToDeck( *ResourceManager::Instance().GetDeckDescriptor(sNewDeckId), maCurrentContext); - -#ifdef DEBUG - // Show the context name in the deck title bar. - if (mpCurrentDeck) - { - DeckTitleBar* pTitleBar = mpCurrentDeck->GetTitleBar(); - if (pTitleBar != NULL) - pTitleBar->SetTitle(msCurrentDeckTitle+A2S(" (")+maCurrentContext.msContext+A2S(")")); - } -#endif } } @@ -461,6 +486,18 @@ void SidebarController::OpenThenSwitchToDeck ( { RequestOpenDeck(); SwitchToDeck(rsDeckId); + mpTabBar->Invalidate(); +} + + + + +void SidebarController::RequestSwitchToDeck ( + const ::rtl::OUString& rsDeckId) +{ + maContextChangeUpdate.CancelRequest(); + maAsynchronousDeckSwitch.RequestCall( + ::boost::bind(&SidebarController::OpenThenSwitchToDeck, this, rsDeckId)); } @@ -544,10 +581,18 @@ void SidebarController::SwitchToDeck ( mpParentWindow, ::boost::bind(&SidebarController::RequestCloseDeck, this))); msCurrentDeckTitle = rDeckDescriptor.msTitle; + } if ( ! mpCurrentDeck) return; +#ifdef DEBUG + // Show the context name in the deck title bar. + DeckTitleBar* pTitleBar = mpCurrentDeck->GetTitleBar(); + if (pTitleBar != NULL) + pTitleBar->SetTitle(rDeckDescriptor.msTitle+A2S(" (")+maCurrentContext.msContext+A2S(")")); +#endif + // Update the panel list. const sal_Int32 nNewPanelCount (aPanelContextDescriptors.size()); SharedPanelContainer aNewPanels; @@ -749,6 +794,7 @@ IMPL_LINK(SidebarController, WindowEventHandler, VclWindowEvent*, pEvent) UpdateTitleBarIcons(); mpParentWindow->Invalidate(); mnRequestedForceFlags |= SwitchFlag_ForceNewDeck | SwitchFlag_ForceNewPanels; + maAsynchronousDeckSwitch.CancelRequest(); maContextChangeUpdate.RequestCall(); break; diff --git a/sfx2/source/sidebar/SidebarController.hxx b/sfx2/source/sidebar/SidebarController.hxx index 44fb76c74efa..365ec8b395ad 100644 --- a/sfx2/source/sidebar/SidebarController.hxx +++ b/sfx2/source/sidebar/SidebarController.hxx @@ -39,6 +39,9 @@ #include <boost/optional.hpp> #include <cppuhelper/compbase4.hxx> #include <cppuhelper/basemutex.hxx> +#include <cppuhelper/weakref.hxx> +#include <comphelper/stl_types.hxx> + namespace css = ::com::sun::star; namespace cssu = ::com::sun::star::uno; @@ -77,6 +80,15 @@ public: const cssu::Reference<css::frame::XFrame>& rxFrame); virtual ~SidebarController (void); + /** Return the SidebarController object that is associated with + the given XFrame. + @return + When there is no SidebarController object for the given + XFrame then <NULL/> is returned. + */ + static SidebarController* GetSidebarControllerForFrame ( + const cssu::Reference<css::frame::XFrame>& rxFrame); + // ui::XContextChangeEventListener virtual void SAL_CALL notifyContextChangeEvent (const css::ui::ContextChangeEventObject& rEvent) throw(cssu::RuntimeException); @@ -110,7 +122,7 @@ public: const static sal_Int32 SwitchFlag_ForceNewDeck = 0x02; const static sal_Int32 SwitchFlag_ForceNewPanels = 0x02; - void SwitchToDeck ( + void RequestSwitchToDeck ( const ::rtl::OUString& rsDeckId); void OpenThenSwitchToDeck ( const ::rtl::OUString& rsDeckId); @@ -126,6 +138,12 @@ public: FocusManager& GetFocusManager (void); private: + typedef ::std::map< + const cssu::Reference<css::frame::XFrame>, + cssu::WeakReference<SidebarController> + > SidebarControllerContainer; + static SidebarControllerContainer maSidebarControllerContainer; + ::boost::scoped_ptr<Deck> mpCurrentDeck; SidebarDockingWindow* mpParentWindow; ::boost::scoped_ptr<TabBar> mpTabBar; @@ -138,6 +156,7 @@ private: ::rtl::OUString msCurrentDeckTitle; AsynchronousCall maPropertyChangeForwarder; AsynchronousCall maContextChangeUpdate; + AsynchronousCall maAsynchronousDeckSwitch; /** Two flags control whether the deck is displayed or if only the tab bar remains visible. @@ -185,6 +204,8 @@ private: const bool bIsInitiallyExpanded, const Context& rContext); void SwitchToDeck ( + const ::rtl::OUString& rsDeckId); + void SwitchToDeck ( const DeckDescriptor& rDeckDescriptor, const Context& rContext); void ShowPopupMenu ( diff --git a/sfx2/source/sidebar/SidebarDockingWindow.hxx b/sfx2/source/sidebar/SidebarDockingWindow.hxx index f59576a521af..80939faa45ba 100644 --- a/sfx2/source/sidebar/SidebarDockingWindow.hxx +++ b/sfx2/source/sidebar/SidebarDockingWindow.hxx @@ -21,7 +21,6 @@ #include "sfx2/dockwin.hxx" #include "sfx2/dockwin.hxx" -#include "Sidebar.hxx" #include <rtl/ref.hxx> diff --git a/sfx2/source/sidebar/TabBar.cxx b/sfx2/source/sidebar/TabBar.cxx index 8c5a1a557290..12a8b1ced330 100644 --- a/sfx2/source/sidebar/TabBar.cxx +++ b/sfx2/source/sidebar/TabBar.cxx @@ -220,9 +220,15 @@ void TabBar::Layout (void) void TabBar::HighlightDeck (const ::rtl::OUString& rsDeckId) { - Item* pItem = GetItemForId(rsDeckId); - if (pItem != NULL) - pItem->mpButton->Check(); + for (ItemContainer::iterator iItem(maItems.begin()),iEnd(maItems.end()); + iItem!=iEnd; + ++iItem) + { + if (iItem->msDeckId.equals(rsDeckId)) + iItem->mpButton->Check(sal_True); + else + iItem->mpButton->Check(sal_False); + } } |