diff options
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/Impress.xcu | 21 | ||||
-rw-r--r-- | officecfg/registry/schema/org/openoffice/Office/Impress.xcs | 36 | ||||
-rw-r--r-- | sd/source/ui/framework/module/ImpressModule.cxx | 4 | ||||
-rw-r--r-- | sd/source/ui/framework/module/ToolPanelModule.cxx | 155 | ||||
-rw-r--r-- | sd/source/ui/framework/module/ToolPanelModule.hxx | 28 | ||||
-rw-r--r-- | svtools/Library_svt.mk | 1 | ||||
-rw-r--r-- | svtools/Package_inc.mk | 1 | ||||
-rw-r--r-- | svtools/inc/svtools/toolpanelopt.hxx | 102 | ||||
-rw-r--r-- | svtools/source/config/toolpanelopt.cxx | 441 |
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: */ |