summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Snelders <programming@ertai.nl>2012-09-01 12:23:14 +0200
committerThorsten Behrens <tbehrens@suse.com>2012-09-14 14:36:14 +0000
commitfb42827f323cec964cbbed3a86f9514ea62b1060 (patch)
tree73047bee0909c0a92d672d3844b4a7cbac15658e
parent76c5f6fdaf3f1d046a7c46e8fe92ebea55ebdd64 (diff)
- fdo#35973 - Remember the state of the sidebar pane in Impress (ToolPanel)
Change-Id: Ifd45a289a5a7b0cb87100e1ff3854ec72143019c Reviewed-on: https://gerrit.libreoffice.org/526 Reviewed-by: Thorsten Behrens <tbehrens@suse.com> Tested-by: Thorsten Behrens <tbehrens@suse.com>
-rw-r--r--officecfg/registry/data/org/openoffice/Office/Impress.xcu21
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Impress.xcs36
-rw-r--r--sd/source/ui/framework/module/ImpressModule.cxx4
-rw-r--r--sd/source/ui/framework/module/ToolPanelModule.cxx155
-rw-r--r--sd/source/ui/framework/module/ToolPanelModule.hxx28
-rw-r--r--svtools/Library_svt.mk1
-rw-r--r--svtools/Package_inc.mk1
-rw-r--r--svtools/inc/svtools/toolpanelopt.hxx102
-rw-r--r--svtools/source/config/toolpanelopt.cxx441
9 files changed, 673 insertions, 116 deletions
diff --git a/officecfg/registry/data/org/openoffice/Office/Impress.xcu b/officecfg/registry/data/org/openoffice/Office/Impress.xcu
index ff44549e801d..de5d5f308779 100644
--- a/officecfg/registry/data/org/openoffice/Office/Impress.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Impress.xcu
@@ -28,6 +28,25 @@
<!DOCTYPE oor:component-data SYSTEM "../../../../component-update.dtd">
<oor:component-data oor:name="Impress" oor:package="org.openoffice.Office" xmlns:install="http://openoffice.org/2004/installation" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<node oor:name="MultiPaneGUI">
+ <node oor:name="ToolPanel">
+ <node oor:name="Visible">
+ <prop oor:name="ImpressView">
+ <value>true</value>
+ </prop>
+ <prop oor:name="OutlineView">
+ <value>false</value>
+ </prop>
+ <prop oor:name="NotesView">
+ <value>true</value>
+ </prop>
+ <prop oor:name="HandoutView">
+ <value>true</value>
+ </prop>
+ <prop oor:name="SlideSorterView">
+ <value>true</value>
+ </prop>
+ </node>
+ </node>
<node oor:name="SlideSorterBar">
<node oor:name="Visible">
<prop oor:name="ImpressView">
@@ -48,7 +67,7 @@
<prop oor:name="DrawView">
<value>true</value>
</prop>
- </node>
+ </node>
</node>
<node oor:name="Framework">
<node oor:name="ResourceFactories">
diff --git a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
index 6ad225f8ba94..aad00d35b07e 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
@@ -1393,6 +1393,42 @@
<desc>Options that control the tool panel.</desc>
<label>Tool Panel Options</label>
</info>
+ <group oor:name="Visible">
+ <info>
+ <desc>Options that control the visibility of the ToolPanel.</desc>
+ <label>ToolPanel Visibility</label>
+ </info>
+ <prop oor:name="ImpressView" oor:type="xs:boolean">
+ <info>
+ <desc>Visibility of the ToolPanel in the Impress view.</desc>
+ <label>ToolPanel Visibility ImpressView</label>
+ </info>
+ </prop>
+ <prop oor:name="OutlineView" oor:type="xs:boolean">
+ <info>
+ <desc>Visibility of the ToolPanel in the Outline view.</desc>
+ <label>ToolPanel Visibility OutlineView</label>
+ </info>
+ </prop>
+ <prop oor:name="NotesView" oor:type="xs:boolean">
+ <info>
+ <desc>Visibility of the ToolPanel in the Notes view.</desc>
+ <label>ToolPanel Visibility NotesView</label>
+ </info>
+ </prop>
+ <prop oor:name="HandoutView" oor:type="xs:boolean">
+ <info>
+ <desc>Visibility of the ToolPanel in the HandOut view.</desc>
+ <label>ToolPanel Visibility HandOutView</label>
+ </info>
+ </prop>
+ <prop oor:name="SlideSorterView" oor:type="xs:boolean">
+ <info>
+ <desc>Visibility of the ToolPanel in the SlideSorter view.</desc>
+ <label>ToolPanel Visibility SlideSorterView</label>
+ </info>
+ </prop>
+ </group>
<set oor:name="RecentlyUsedMasterPages" oor:node-type="MasterPageDescriptor">
<info>
<desc>List of the URLs of the most recently used master pages.</desc>
diff --git a/sd/source/ui/framework/module/ImpressModule.cxx b/sd/source/ui/framework/module/ImpressModule.cxx
index 1e7810ba8d8e..50e9cfb67f45 100644
--- a/sd/source/ui/framework/module/ImpressModule.cxx
+++ b/sd/source/ui/framework/module/ImpressModule.cxx
@@ -45,7 +45,9 @@ void ImpressModule::Initialize (Reference<frame::XController>& rxController)
new SlideSorterModule(
rxController,
FrameworkHelper::msLeftImpressPaneURL);
- ToolPanelModule::Initialize(rxController);
+ new ToolPanelModule(
+ rxController,
+ FrameworkHelper::msRightPaneURL);
new ToolBarModule(rxController);
new ShellStackGuard(rxController);
}
diff --git a/sd/source/ui/framework/module/ToolPanelModule.cxx b/sd/source/ui/framework/module/ToolPanelModule.cxx
index 3397d5ce67ac..880a49d2ffe7 100644
--- a/sd/source/ui/framework/module/ToolPanelModule.cxx
+++ b/sd/source/ui/framework/module/ToolPanelModule.cxx
@@ -19,136 +19,75 @@
#include "ToolPanelModule.hxx"
-#include "ReadOnlyModeObserver.hxx"
-#include "framework/FrameworkHelper.hxx"
-#include <com/sun/star/lang/XInitialization.hpp>
-#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include "framework/FrameworkHelper.hxx"
+#include <com/sun/star/drawing/framework/XTabBar.hpp>
+#include <com/sun/star/drawing/framework/TabBarButton.hpp>
-#include <comphelper/processfactory.hxx>
-#include <cppuhelper/compbase1.hxx>
-#include <boost/enable_shared_from_this.hpp>
+#include "strings.hrc"
+#include "sdresid.hxx"
+#include "svtools/toolpanelopt.hxx"
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::drawing::framework;
+
using ::rtl::OUString;
using ::sd::framework::FrameworkHelper;
namespace sd { namespace framework {
-namespace {
-
-typedef ::cppu::WeakComponentImplHelper1 <
- ::com::sun::star::frame::XStatusListener
- > LocalReadOnlyModeObserverInterfaceBase;
-
-/** This local class enables or disables the ResourceManager of a
- ToolPanelModule. It connects to a ReadOnlyModeObserver and is called
- when the state of the .uno:EditDoc command changes. When either the
- ResourceManager or the ReadOnlyModeObserver are disposed then the
- LocalReadOnlyModeObserver disposes itself. The link
- between the ResourceManager and the ReadOnlyModeObserver is removed and
- the ReadOnlyModeObserver typically looses its last reference and is
- destroyed.
-*/
-class LocalReadOnlyModeObserver
- : private MutexOwner,
- public LocalReadOnlyModeObserverInterfaceBase
-{
-public:
- LocalReadOnlyModeObserver (
- const Reference<frame::XController>& rxController,
- const ::rtl::Reference<ResourceManager>& rpResourceManager)
- : MutexOwner(),
- LocalReadOnlyModeObserverInterfaceBase(maMutex),
- mpResourceManager(rpResourceManager),
- mpObserver(new ReadOnlyModeObserver(rxController))
- {
- mpObserver->AddStatusListener(this);
- Reference<lang::XComponent> xComponent (
- static_cast<XWeak*>(mpResourceManager.get()), UNO_QUERY);
- if (xComponent.is())
- xComponent->addEventListener(this);
- }
+//===== ToolPanelModule ==================================================
- ~LocalReadOnlyModeObserver (void)
- {
- }
-
- virtual void SAL_CALL disposing (void)
- {
- Reference<lang::XComponent> xComponent (static_cast<XWeak*>(mpObserver.get()), UNO_QUERY);
- if (xComponent.is())
- xComponent->dispose();
-
- xComponent = Reference<lang::XComponent>(
- static_cast<XWeak*>(mpResourceManager.get()), UNO_QUERY);
- if (xComponent.is())
- xComponent->removeEventListener(this);
-
- }
-
- virtual void SAL_CALL disposing (const com::sun::star::lang::EventObject& rEvent)
- throw(RuntimeException)
- {
- if (rEvent.Source == Reference<XInterface>(static_cast<XWeak*>(mpObserver.get())))
- {
- mpObserver = NULL;
- }
- else if (rEvent.Source == Reference<XInterface>(
- static_cast<XWeak*>(mpResourceManager.get())))
- {
- mpResourceManager = NULL;
- }
- dispose();
- }
-
- virtual void SAL_CALL statusChanged (const com::sun::star::frame::FeatureStateEvent& rEvent)
- throw(RuntimeException)
+ToolPanelModule::ToolPanelModule (
+ const Reference<frame::XController>& rxController,
+ const OUString& rsRightPaneURL)
+ : ResourceManager(rxController,
+ FrameworkHelper::CreateResourceId(FrameworkHelper::msTaskPaneURL, rsRightPaneURL)),
+ mxControllerManager(rxController,UNO_QUERY)
+{
+ if (mxConfigurationController.is())
{
- bool bReadWrite (true);
- if (rEvent.IsEnabled)
- rEvent.State >>= bReadWrite;
-
- if (bReadWrite)
- mpResourceManager->Enable();
- else
- mpResourceManager->Disable();
+ if (SvtToolPanelOptions().GetVisibleImpressView()==sal_True)
+ AddActiveMainView(FrameworkHelper::msImpressViewURL);
+ if (SvtToolPanelOptions().GetVisibleOutlineView()==sal_True)
+ AddActiveMainView(FrameworkHelper::msOutlineViewURL);
+ if (SvtToolPanelOptions().GetVisibleNotesView()==sal_True)
+ AddActiveMainView(FrameworkHelper::msNotesViewURL);
+ if (SvtToolPanelOptions().GetVisibleHandoutView()==sal_True)
+ AddActiveMainView(FrameworkHelper::msHandoutViewURL);
+ if (SvtToolPanelOptions().GetVisibleSlideSorterView()==sal_True)
+ AddActiveMainView(FrameworkHelper::msSlideSorterURL);
+
+ mxConfigurationController->addConfigurationChangeListener(
+ this,
+ FrameworkHelper::msResourceActivationEvent,
+ Any());
}
-
-private:
- ::rtl::Reference<ResourceManager> mpResourceManager;
- ::rtl::Reference<ReadOnlyModeObserver> mpObserver;
-
-};
}
-
-
-
-//===== ToolPanelModule ====================================================
-
-void ToolPanelModule::Initialize (const Reference<frame::XController>& rxController)
+ToolPanelModule::~ToolPanelModule (void)
{
- ::rtl::Reference<ResourceManager> pResourceManager (
- new ResourceManager(
- rxController,
- FrameworkHelper::CreateResourceId(
- FrameworkHelper::msTaskPaneURL,
- FrameworkHelper::msRightPaneURL)));
- pResourceManager->AddActiveMainView(FrameworkHelper::msImpressViewURL);
- pResourceManager->AddActiveMainView(FrameworkHelper::msNotesViewURL);
- pResourceManager->AddActiveMainView(FrameworkHelper::msHandoutViewURL);
- pResourceManager->AddActiveMainView(FrameworkHelper::msSlideSorterURL);
-
- new LocalReadOnlyModeObserver(rxController, pResourceManager);
}
+void ToolPanelModule::SaveResourceState (void)
+{
+ SvtToolPanelOptions().SetVisibleImpressView(IsResourceActive(FrameworkHelper::msImpressViewURL));
+ SvtToolPanelOptions().SetVisibleOutlineView(IsResourceActive(FrameworkHelper::msOutlineViewURL));
+ SvtToolPanelOptions().SetVisibleNotesView(IsResourceActive(FrameworkHelper::msNotesViewURL));
+ SvtToolPanelOptions().SetVisibleHandoutView(IsResourceActive(FrameworkHelper::msHandoutViewURL));
+ SvtToolPanelOptions().SetVisibleSlideSorterView(IsResourceActive(FrameworkHelper::msSlideSorterURL));
+}
-
+void SAL_CALL ToolPanelModule::notifyConfigurationChange (
+ const ConfigurationChangeEvent& rEvent)
+ throw (RuntimeException)
+{
+ if (!rEvent.Type.equals(FrameworkHelper::msResourceActivationEvent))
+ ResourceManager::notifyConfigurationChange(rEvent);
+}
} } // end of namespace sd::framework
diff --git a/sd/source/ui/framework/module/ToolPanelModule.hxx b/sd/source/ui/framework/module/ToolPanelModule.hxx
index 90b78fa5b366..cfc1f7c32b97 100644
--- a/sd/source/ui/framework/module/ToolPanelModule.hxx
+++ b/sd/source/ui/framework/module/ToolPanelModule.hxx
@@ -17,22 +17,38 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#ifndef SD_FRAMEWORK_TOOL_PANEL_MODULE_HXX
-#define SD_FRAMEWORK_TOOL_PANEL_MODULE_HXX
+#ifndef SD_FRAMEWORK_TOOLPANEL_MODULE_HXX
+#define SD_FRAMEWORK_TOOLPANEL_MODULE_HXX
#include "ResourceManager.hxx"
-#include <rtl/ref.hxx>
+#include <com/sun/star/drawing/framework/XControllerManager.hpp>
+#include <com/sun/star/drawing/framework/XTabBar.hpp>
+
+namespace css = ::com::sun::star;
namespace sd { namespace framework {
-/** This module is responsible for showing the task pane.
+/** This module is responsible for showing the toolpanel bar.
*/
class ToolPanelModule
+ : public ResourceManager
{
public:
- static void Initialize (
- const ::com::sun::star::uno::Reference<com::sun::star::frame::XController>& rxController);
+ ToolPanelModule (
+ const css::uno::Reference<css::frame::XController>& rxController,
+ const ::rtl::OUString& rsRightPaneURL);
+ virtual ~ToolPanelModule (void);
+
+ virtual void SaveResourceState (void);
+ // XConfigurationChangeListener
+
+ virtual void SAL_CALL notifyConfigurationChange (
+ const css::drawing::framework::ConfigurationChangeEvent& rEvent)
+ throw (css::uno::RuntimeException);
+
+private:
+ css::uno::Reference<css::drawing::framework::XControllerManager> mxControllerManager;
};
} } // end of namespace sd::framework
diff --git a/svtools/Library_svt.mk b/svtools/Library_svt.mk
index 77c3031007c0..cfdadd9be371 100644
--- a/svtools/Library_svt.mk
+++ b/svtools/Library_svt.mk
@@ -90,6 +90,7 @@ $(eval $(call gb_Library_add_exception_objects,svt,\
svtools/source/config/menuoptions \
svtools/source/config/miscopt \
svtools/source/config/slidesorterbaropt \
+ svtools/source/config/toolpanelopt \
svtools/source/config/optionsdrawinglayer \
svtools/source/config/printoptions \
svtools/source/contnr/DocumentInfoPreview \
diff --git a/svtools/Package_inc.mk b/svtools/Package_inc.mk
index 76480858b0f6..d06053c0f0ec 100644
--- a/svtools/Package_inc.mk
+++ b/svtools/Package_inc.mk
@@ -109,6 +109,7 @@ $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/localresaccess.hxx,svt
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/menuoptions.hxx,svtools/menuoptions.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/miscopt.hxx,svtools/miscopt.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/slidesorterbaropt.hxx,svtools/slidesorterbaropt.hxx))
+$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/toolpanelopt.hxx,svtools/toolpanelopt.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/optionsdrawinglayer.hxx,svtools/optionsdrawinglayer.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/parhtml.hxx,svtools/parhtml.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/parrtf.hxx,svtools/parrtf.hxx))
diff --git a/svtools/inc/svtools/toolpanelopt.hxx b/svtools/inc/svtools/toolpanelopt.hxx
new file mode 100644
index 000000000000..4c70256ae3b6
--- /dev/null
+++ b/svtools/inc/svtools/toolpanelopt.hxx
@@ -0,0 +1,102 @@
+/* -*- 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 INCLUDED_SVTOOLS_TOOLPANELOPT_HXX
+#define INCLUDED_SVTOOLS_TOOLPANELOPT_HXX
+
+#include "svtools/svtdllapi.h"
+#include <sal/types.h>
+#include <osl/mutex.hxx>
+#include <com/sun/star/uno/Sequence.h>
+#include <rtl/ustring.hxx>
+#include <unotools/options.hxx>
+
+/** forward declaration to our private date container implementation
+
+ We use these class as internal member to support small memory requirements.
+ You can create the container if it is neccessary. The class which use these mechanism
+ is faster and smaller then a complete implementation!
+*/
+class SvtToolPanelOptions_Impl;
+class Link;
+
+/** collect informations about sidebar group
+
+ \attention This class is partially threadsafe.
+*/
+class SVT_DLLPUBLIC SvtToolPanelOptions: public utl::detail::Options
+{
+ public:
+ /** standard constructor and destructor
+
+ This will initialize an instance with default values.
+ We implement these class with a refcount mechanism! Every instance of this class increase it
+ at create and decrease it at delete time - but all instances use the same data container!
+ He is implemented as a static member ...
+
+ \sa member m_nRefCount
+ \sa member m_pDataContainer
+ */
+ SvtToolPanelOptions();
+ virtual ~SvtToolPanelOptions();
+
+ void AddListenerLink( const Link& rLink );
+ void RemoveListenerLink( const Link& rLink );
+
+ bool GetVisibleImpressView() const;
+ void SetVisibleImpressView( bool bVisible );
+ bool GetVisibleOutlineView() const;
+ void SetVisibleOutlineView( bool bVisible );
+ bool GetVisibleNotesView() const;
+ void SetVisibleNotesView( bool bVisible );
+ bool GetVisibleHandoutView() const;
+ void SetVisibleHandoutView( bool bVisible );
+ bool GetVisibleSlideSorterView() const;
+ void SetVisibleSlideSorterView( bool bVisible );
+ bool GetVisibleDrawView() const;
+ void SetVisibleDrawView( bool bVisible );
+
+
+ private:
+ /** return a reference to a static mutex
+
+ These class is partially threadsafe (for de-/initialization only).
+ All access methods are'nt safe!
+ We create a static mutex only for one ime and use at different times.
+
+ \return A reference to a static mutex member.*/
+ SVT_DLLPRIVATE static ::osl::Mutex& GetInitMutex();
+
+ private:
+
+ /**
+ \attention
+ Don't initialize these static member in these header!
+ \li Double defined symbols will be detected ...
+ \li and unresolved externals exist at linking time.
+ Do it in your source only.
+ */
+ static SvtToolPanelOptions_Impl* m_pDataContainer; ///< impl. data container as dynamic pointer for smaller memory requirements!
+ static sal_Int32 m_nRefCount; ///< internal ref count mechanism
+
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/config/toolpanelopt.cxx b/svtools/source/config/toolpanelopt.cxx
new file mode 100644
index 000000000000..2f580222fd95
--- /dev/null
+++ b/svtools/source/config/toolpanelopt.cxx
@@ -0,0 +1,441 @@
+/* -*- 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 .
+ */
+
+#include <svtools/toolpanelopt.hxx>
+#include <unotools/configmgr.hxx>
+#include <unotools/configitem.hxx>
+#include <tools/debug.hxx>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <tools/link.hxx>
+
+#include <rtl/logfile.hxx>
+#include <rtl/instance.hxx>
+#include "itemholder2.hxx"
+
+#include <svtools/imgdef.hxx>
+#include <vcl/svapp.hxx>
+
+#include <list>
+
+using namespace ::utl;
+using namespace ::rtl;
+using namespace ::osl;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
+
+#define ROOTNODE_TOOLPANEL OUString("Office.Impress/MultiPaneGUI/ToolPanel/Visible")
+
+#define PROPERTYNAME_VISIBLE_IMPRESSVIEW OUString("ImpressView")
+#define PROPERTYHANDLE_VISIBLE_IMPRESSVIEW 0
+#define PROPERTYNAME_VISIBLE_OUTLINEVIEW OUString("OutlineView")
+#define PROPERTYHANDLE_VISIBLE_OUTLINEVIEW 1
+#define PROPERTYNAME_VISIBLE_NOTESVIEW OUString("NotesView")
+#define PROPERTYHANDLE_VISIBLE_NOTESVIEW 2
+#define PROPERTYNAME_VISIBLE_HANDOUTVIEW OUString("HandoutView")
+#define PROPERTYHANDLE_VISIBLE_HANDOUTVIEW 3
+#define PROPERTYNAME_VISIBLE_SLIDESORTERVIEW OUString("SlideSorterView")
+#define PROPERTYHANDLE_VISIBLE_SLIDESORTERVIEW 4
+
+#define PROPERTYCOUNT 5
+
+class SvtToolPanelOptions_Impl : public ConfigItem
+{
+ private:
+ ::std::list<Link> aList;
+ Sequence< OUString > m_seqPropertyNames;
+
+ public:
+
+ SvtToolPanelOptions_Impl();
+ ~SvtToolPanelOptions_Impl();
+
+ /** called for notify of configmanager
+
+ These method is called from the ConfigManager before application ends or from the
+ PropertyChangeListener if the sub tree broadcasts changes. You must update your
+ internal values.
+
+ \sa baseclass ConfigItem
+ \param[in,out] seqPropertyNames is the list of properties which should be updated.
+ */
+ virtual void Notify( const Sequence< OUString >& seqPropertyNames );
+
+ /**
+ loads required data from the configuration. It's called in the constructor to
+ read all entries and form ::Notify to re-read changed setting
+ */
+ void Load( const Sequence< OUString >& rPropertyNames );
+
+ /** write changes to configuration
+
+ These method writes the changed values into the sub tree
+ and should always called in our destructor to guarantee consistency of config data.
+
+ \sa baseclass ConfigItem
+ */
+ virtual void Commit();
+
+ // public interface
+ bool m_bVisibleImpressView;
+ bool m_bVisibleOutlineView;
+ bool m_bVisibleNotesView;
+ bool m_bVisibleHandoutView;
+ bool m_bVisibleSlideSorterView;
+
+ void AddListenerLink( const Link& rLink );
+ void RemoveListenerLink( const Link& rLink );
+ void CallListeners();
+
+ private:
+ /** return list of key names of our configuration management which represent oue module tree
+
+ These methods return a static const list of key names. We need it to get needed values from our
+ configuration management.
+
+ \return A list of needed configuration keys is returned.
+ */
+ static Sequence< OUString > GetPropertyNames();
+
+ protected:
+};
+
+SvtToolPanelOptions_Impl::SvtToolPanelOptions_Impl()
+ // Init baseclasses first
+ : ConfigItem( ROOTNODE_TOOLPANEL )
+
+ , m_bVisibleImpressView( false )
+ , m_bVisibleOutlineView( false )
+ , m_bVisibleNotesView( false )
+ , m_bVisibleHandoutView( false )
+ , m_bVisibleSlideSorterView( false )
+
+{
+ m_seqPropertyNames = GetPropertyNames( );
+
+ // Use our static list of configuration keys to get his values.
+ Sequence< Any > seqValues = GetProperties( m_seqPropertyNames );
+
+ // Safe impossible cases.
+ // We need values from ALL configuration keys.
+ // Follow assignment use order of values in relation to our list of key names!
+ DBG_ASSERT( !(m_seqPropertyNames.getLength()!=seqValues.getLength()),
+ "SvtToolPanelOptions_Impl::SvtToolPanelOptions_Impl()\nI miss some values of configuration keys!\n" );
+
+ // Copy values from list in right order to our internal member.
+ for( sal_Int32 nProperty=0; nProperty<seqValues.getLength(); ++nProperty )
+ {
+ if (seqValues[nProperty].hasValue()==sal_False)
+ continue;
+ switch( nProperty )
+ {
+ case PROPERTYHANDLE_VISIBLE_IMPRESSVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleImpressView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleImpressView\"!" );
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_OUTLINEVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleOutlineView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleOutlineView\"!" );
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_NOTESVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleNotesView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleNotesView\"!" );
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_HANDOUTVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleHandoutView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleHandoutView\"!" );
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_SLIDESORTERVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleSlideSorterView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleSlideSorterView\"!" );
+ break;
+ }
+ }
+ }
+
+ // Enable notification mechanism of our baseclass.
+ // We need it to get information about changes outside these class on our used configuration keys!
+ EnableNotification( m_seqPropertyNames );
+}
+
+SvtToolPanelOptions_Impl::~SvtToolPanelOptions_Impl()
+{
+ Commit();
+}
+
+static int lcl_MapPropertyName( const ::rtl::OUString rCompare,
+ const uno::Sequence< ::rtl::OUString>& aInternalPropertyNames)
+{
+ for(int nProp = 0; nProp < aInternalPropertyNames.getLength(); ++nProp)
+ {
+ if( aInternalPropertyNames[nProp] == rCompare )
+ return nProp;
+ }
+ return -1;
+}
+
+void SvtToolPanelOptions_Impl::Load( const Sequence< OUString >& rPropertyNames )
+{
+ const uno::Sequence< ::rtl::OUString> aInternalPropertyNames( GetPropertyNames());
+ Sequence< Any > seqValues = GetProperties( rPropertyNames );
+
+ // Safe impossible cases.
+ // We need values from ALL configuration keys.
+ // Follow assignment use order of values in relation to our list of key names!
+ DBG_ASSERT( !(rPropertyNames.getLength()!=seqValues.getLength()),
+ "SvtToolPanelOptions_Impl::SvtToolPanelOptions_Impl()\nI miss some values of configuration keys!\n" );
+
+ // Copy values from list in right order to our internal member.
+ for( sal_Int32 nProperty=0; nProperty<seqValues.getLength(); ++nProperty )
+ {
+ if (seqValues[nProperty].hasValue()==sal_False)
+ continue;
+ switch( lcl_MapPropertyName(rPropertyNames[nProperty], aInternalPropertyNames) )
+ {
+ case PROPERTYHANDLE_VISIBLE_IMPRESSVIEW:
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleImpressView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleImpressView\"!" );
+ }
+ break;
+ case PROPERTYHANDLE_VISIBLE_OUTLINEVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleOutlineView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleOutlineView\"!" );
+ }
+ break;
+ case PROPERTYHANDLE_VISIBLE_NOTESVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleNotesView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleNotesView\"!" );
+ }
+ break;
+ case PROPERTYHANDLE_VISIBLE_HANDOUTVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleHandoutView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleHandoutView\"!" );
+ }
+ break;
+ case PROPERTYHANDLE_VISIBLE_SLIDESORTERVIEW :
+ {
+ if( !(seqValues[nProperty] >>= m_bVisibleSlideSorterView) )
+ OSL_FAIL("Wrong type of \"ToolPanel\\VisibleSlideSorterView\"!" );
+ }
+ break;
+ }
+ }
+}
+
+void SvtToolPanelOptions_Impl::AddListenerLink( const Link& rLink )
+{
+ aList.push_back( rLink );
+}
+
+void SvtToolPanelOptions_Impl::RemoveListenerLink( const Link& rLink )
+{
+ for ( ::std::list<Link>::iterator iter = aList.begin(); iter != aList.end(); ++iter )
+ {
+ if ( *iter == rLink )
+ {
+ aList.erase(iter);
+ break;
+ }
+ }
+}
+
+void SvtToolPanelOptions_Impl::CallListeners()
+{
+ for ( ::std::list<Link>::const_iterator iter = aList.begin(); iter != aList.end(); ++iter )
+ iter->Call( this );
+}
+
+void SvtToolPanelOptions_Impl::Notify( const Sequence< OUString >& rPropertyNames )
+{
+ Load( rPropertyNames );
+ CallListeners();
+}
+
+void SvtToolPanelOptions_Impl::Commit()
+{
+ // Get names of supported properties, create a list for values and copy current values to it.
+ sal_Int32 nCount = m_seqPropertyNames.getLength();
+ Sequence< Any > seqValues ( nCount );
+ for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
+ {
+ switch( nProperty )
+ {
+ case PROPERTYHANDLE_VISIBLE_IMPRESSVIEW:
+ {
+ seqValues[nProperty] <<= m_bVisibleImpressView;
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_OUTLINEVIEW:
+ {
+ seqValues[nProperty] <<= m_bVisibleOutlineView;
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_NOTESVIEW:
+ {
+ seqValues[nProperty] <<= m_bVisibleNotesView;
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_HANDOUTVIEW:
+ {
+ seqValues[nProperty] <<= m_bVisibleHandoutView;
+ break;
+ }
+ case PROPERTYHANDLE_VISIBLE_SLIDESORTERVIEW:
+ {
+ seqValues[nProperty] <<= m_bVisibleSlideSorterView;
+ break;
+ }
+ }
+ }
+ // Set properties in configuration.
+ PutProperties( m_seqPropertyNames, seqValues );
+}
+
+Sequence< OUString > SvtToolPanelOptions_Impl::GetPropertyNames()
+{
+ // Build list of configuration key names.
+ OUString pProperties[] =
+ {
+ PROPERTYNAME_VISIBLE_IMPRESSVIEW,
+ PROPERTYNAME_VISIBLE_OUTLINEVIEW,
+ PROPERTYNAME_VISIBLE_NOTESVIEW,
+ PROPERTYNAME_VISIBLE_HANDOUTVIEW,
+ PROPERTYNAME_VISIBLE_SLIDESORTERVIEW,
+ };
+
+ // Initialize return sequence with these list and run
+ return Sequence< OUString >( pProperties, SAL_N_ELEMENTS( pProperties ) );
+}
+
+// initialize static member, see definition for further information
+// DON'T DO IT IN YOUR HEADER!
+SvtToolPanelOptions_Impl* SvtToolPanelOptions::m_pDataContainer = NULL;
+sal_Int32 SvtToolPanelOptions::m_nRefCount = 0;
+
+SvtToolPanelOptions::SvtToolPanelOptions()
+{
+ // Global access, must be guarded (multithreading!).
+ MutexGuard aGuard( GetInitMutex() );
+ ++m_nRefCount;
+ // ... and initialize our data container only if it not already exist!
+ if( m_pDataContainer == NULL )
+ {
+ RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtToolPanelOptions_Impl::ctor()");
+ m_pDataContainer = new SvtToolPanelOptions_Impl;
+ }
+}
+
+SvtToolPanelOptions::~SvtToolPanelOptions()
+{
+ // Global access, must be guarded (multithreading!)
+ MutexGuard aGuard( GetInitMutex() );
+ --m_nRefCount;
+ // If last instance was deleted we must destroy our static data container!
+ if( m_nRefCount <= 0 )
+ {
+ delete m_pDataContainer;
+ m_pDataContainer = NULL;
+ }
+}
+
+bool SvtToolPanelOptions::GetVisibleImpressView() const
+{
+ return m_pDataContainer->m_bVisibleImpressView;
+}
+
+void SvtToolPanelOptions::SetVisibleImpressView(bool bVisible)
+{
+ m_pDataContainer->m_bVisibleImpressView = bVisible;
+}
+
+bool SvtToolPanelOptions::GetVisibleOutlineView() const
+{
+ return m_pDataContainer->m_bVisibleOutlineView;
+}
+
+void SvtToolPanelOptions::SetVisibleOutlineView(bool bVisible)
+{
+ m_pDataContainer->m_bVisibleOutlineView = bVisible;
+}
+
+bool SvtToolPanelOptions::GetVisibleNotesView() const
+{
+ return m_pDataContainer->m_bVisibleNotesView;
+}
+
+void SvtToolPanelOptions::SetVisibleNotesView(bool bVisible)
+{
+ m_pDataContainer->m_bVisibleNotesView = bVisible;
+}
+
+bool SvtToolPanelOptions::GetVisibleHandoutView() const
+{
+ return m_pDataContainer->m_bVisibleHandoutView;
+}
+
+void SvtToolPanelOptions::SetVisibleHandoutView(bool bVisible)
+{
+ m_pDataContainer->m_bVisibleHandoutView = bVisible;
+}
+
+bool SvtToolPanelOptions::GetVisibleSlideSorterView() const
+{
+ return m_pDataContainer->m_bVisibleSlideSorterView;
+}
+
+void SvtToolPanelOptions::SetVisibleSlideSorterView(bool bVisible)
+{
+ m_pDataContainer->m_bVisibleSlideSorterView = bVisible;
+}
+
+namespace
+{
+ class theSvtToolPanelOptionsMutex :
+ public rtl::Static< osl::Mutex, theSvtToolPanelOptionsMutex > {};
+}
+
+Mutex & SvtToolPanelOptions::GetInitMutex()
+{
+ return theSvtToolPanelOptionsMutex::get();
+}
+
+void SvtToolPanelOptions::AddListenerLink( const Link& rLink )
+{
+ m_pDataContainer->AddListenerLink( rLink );
+}
+
+void SvtToolPanelOptions::RemoveListenerLink( const Link& rLink )
+{
+ m_pDataContainer->RemoveListenerLink( rLink );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */