summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorAndre Fischer <af@apache.org>2013-06-05 15:40:56 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-09-20 16:35:29 +0100
commit50cbbc7f3afdd077e98f416f97390fe93428e8cf (patch)
treef1f0bdfa883202bd8fe382f8f99afda454c3e30e /sfx2
parentd023339c2f85555212bdb9804854dcc2c403b50e (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')
-rw-r--r--sfx2/Library_sfx.mk1
-rw-r--r--sfx2/source/sidebar/AsynchronousCall.cxx9
-rw-r--r--sfx2/source/sidebar/AsynchronousCall.hxx1
-rw-r--r--sfx2/source/sidebar/Sidebar.cxx66
-rw-r--r--sfx2/source/sidebar/Sidebar.hxx67
-rw-r--r--sfx2/source/sidebar/SidebarController.cxx66
-rw-r--r--sfx2/source/sidebar/SidebarController.hxx23
-rw-r--r--sfx2/source/sidebar/SidebarDockingWindow.hxx1
-rw-r--r--sfx2/source/sidebar/TabBar.cxx12
9 files changed, 123 insertions, 123 deletions
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index 46ed25d449e2..6f145ce10c05 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -234,6 +234,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
sfx2/source/menu/virtmenu \
sfx2/source/notify/eventsupplier \
sfx2/source/notify/hintpost \
+ sfx2/source/sidebar/Sidebar \
sfx2/source/sidebar/SidebarChildWindow \
sfx2/source/sidebar/SidebarDockingWindow \
sfx2/source/sidebar/SidebarController \
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);
+ }
}