summaryrefslogtreecommitdiffstats
path: root/svtools
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 /svtools
parentMore 2.3 styling + fix for flickering bug on multi-slide change. (diff)
downloadcore-fb42827f323cec964cbbed3a86f9514ea62b1060.tar.gz
core-fb42827f323cec964cbbed3a86f9514ea62b1060.zip
- 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>
Diffstat (limited to 'svtools')
-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
4 files changed, 545 insertions, 0 deletions
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: */