[Libreoffice-commits] .: officecfg/registry sd/source svtools/inc svtools/Library_svt.mk svtools/Package_inc.mk svtools/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri Sep 14 07:36:33 PDT 2012


 officecfg/registry/data/org/openoffice/Office/Impress.xcu   |   21 
 officecfg/registry/schema/org/openoffice/Office/Impress.xcs |   36 
 sd/source/ui/framework/module/ImpressModule.cxx             |    4 
 sd/source/ui/framework/module/ToolPanelModule.cxx           |  155 +---
 sd/source/ui/framework/module/ToolPanelModule.hxx           |   28 
 svtools/Library_svt.mk                                      |    1 
 svtools/Package_inc.mk                                      |    1 
 svtools/inc/svtools/toolpanelopt.hxx                        |  102 ++
 svtools/source/config/toolpanelopt.cxx                      |  441 ++++++++++++
 9 files changed, 673 insertions(+), 116 deletions(-)

New commits:
commit fb42827f323cec964cbbed3a86f9514ea62b1060
Author: Rob Snelders <programming at ertai.nl>
Date:   Sat Sep 1 12:23:14 2012 +0200

    - 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 at suse.com>
    Tested-by: Thorsten Behrens <tbehrens at suse.com>

diff --git a/officecfg/registry/data/org/openoffice/Office/Impress.xcu b/officecfg/registry/data/org/openoffice/Office/Impress.xcu
index ff44549..de5d5f3 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 6ad225f..aad00d3 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 1e7810b..50e9cfb 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 3397d5c..880a49d 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 90b78fa..cfc1f7c 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 77c3031..cfdadd9 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 7648085..d06053c 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 0000000..4c70256
--- /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 0000000..2f58022
--- /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: */


More information about the Libreoffice-commits mailing list