xref: /aoo41x/main/sfx2/source/dialog/taskpane.cxx (revision 5e8455cf)
1d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3d119d52dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4d119d52dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5d119d52dSAndrew Rist  * distributed with this work for additional information
6d119d52dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7d119d52dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8d119d52dSAndrew Rist  * "License"); you may not use this file except in compliance
9d119d52dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10d119d52dSAndrew Rist  *
11d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12d119d52dSAndrew Rist  *
13d119d52dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14d119d52dSAndrew Rist  * software distributed under the License is distributed on an
15d119d52dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d119d52dSAndrew Rist  * KIND, either express or implied.  See the License for the
17d119d52dSAndrew Rist  * specific language governing permissions and limitations
18d119d52dSAndrew Rist  * under the License.
19d119d52dSAndrew Rist  *
20d119d52dSAndrew Rist  *************************************************************/
21d119d52dSAndrew Rist 
22d119d52dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "sfx2/taskpane.hxx"
27cdf0e10cSrcweir #include "imagemgr.hxx"
28cdf0e10cSrcweir #include "sfx2/sfxsids.hrc"
29cdf0e10cSrcweir #include "sfx2/bindings.hxx"
30cdf0e10cSrcweir #include "sfx2/dispatch.hxx"
31cdf0e10cSrcweir #include "sfxresid.hxx"
32cdf0e10cSrcweir #include "sfxlocal.hrc"
33cdf0e10cSrcweir #include "helpid.hrc"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir /** === begin UNO includes === **/
36cdf0e10cSrcweir #include <com/sun/star/frame/XModuleManager.hpp>
37cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
38cdf0e10cSrcweir #include <com/sun/star/ui/XToolPanel.hpp>
39cdf0e10cSrcweir #include <com/sun/star/ui/XUIElementFactory.hpp>
40cdf0e10cSrcweir #include <com/sun/star/awt/XWindowPeer.hpp>
41cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp>
42cdf0e10cSrcweir #include <com/sun/star/frame/XModuleManager.hpp>
43cdf0e10cSrcweir #include <com/sun/star/graphic/XGraphicProvider.hpp>
44cdf0e10cSrcweir #include <com/sun/star/accessibility/XAccessible.hpp>
45cdf0e10cSrcweir #include <com/sun/star/awt/XControl.hpp>
46cdf0e10cSrcweir /** === end UNO includes === **/
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <comphelper/componentcontext.hxx>
49cdf0e10cSrcweir #include <comphelper/namedvaluecollection.hxx>
50cdf0e10cSrcweir #include <comphelper/types.hxx>
51cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
52cdf0e10cSrcweir #include <tools/diagnose_ex.h>
53cdf0e10cSrcweir #include <svtools/toolpanel/toolpaneldeck.hxx>
54cdf0e10cSrcweir #include <svtools/toolpanel/tablayouter.hxx>
55cdf0e10cSrcweir #include <svtools/toolpanel/drawerlayouter.hxx>
56cdf0e10cSrcweir #include <unotools/confignode.hxx>
57cdf0e10cSrcweir #include <vcl/menu.hxx>
58cdf0e10cSrcweir #include <vcl/svapp.hxx>
59cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
60cdf0e10cSrcweir #include <tools/urlobj.hxx>
61cdf0e10cSrcweir #include <boost/noncopyable.hpp>
62cdf0e10cSrcweir 
63cdf0e10cSrcweir //......................................................................................................................
64cdf0e10cSrcweir namespace sfx2
65cdf0e10cSrcweir {
66cdf0e10cSrcweir //......................................................................................................................
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     /** === begin UNO using === **/
69cdf0e10cSrcweir 	using ::com::sun::star::uno::Reference;
70cdf0e10cSrcweir 	using ::com::sun::star::uno::XInterface;
71cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_QUERY;
72cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_QUERY_THROW;
73cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_SET_THROW;
74cdf0e10cSrcweir 	using ::com::sun::star::uno::Exception;
75cdf0e10cSrcweir 	using ::com::sun::star::uno::RuntimeException;
76cdf0e10cSrcweir 	using ::com::sun::star::uno::Any;
77cdf0e10cSrcweir 	using ::com::sun::star::uno::makeAny;
78cdf0e10cSrcweir 	using ::com::sun::star::uno::Sequence;
79cdf0e10cSrcweir 	using ::com::sun::star::uno::Type;
80cdf0e10cSrcweir     using ::com::sun::star::frame::XModuleManager;
81cdf0e10cSrcweir     using ::com::sun::star::container::XNameAccess;
82cdf0e10cSrcweir     using ::com::sun::star::ui::XToolPanel;
83cdf0e10cSrcweir     using ::com::sun::star::ui::XUIElementFactory;
84cdf0e10cSrcweir     using ::com::sun::star::ui::XUIElement;
85cdf0e10cSrcweir     using ::com::sun::star::awt::XWindow;
86cdf0e10cSrcweir     using ::com::sun::star::frame::XModuleManager;
87cdf0e10cSrcweir     using ::com::sun::star::frame::XFrame;
88cdf0e10cSrcweir     using ::com::sun::star::lang::XComponent;
89cdf0e10cSrcweir     using ::com::sun::star::graphic::XGraphicProvider;
90cdf0e10cSrcweir     using ::com::sun::star::graphic::XGraphic;
91cdf0e10cSrcweir     using ::com::sun::star::accessibility::XAccessible;
92cdf0e10cSrcweir     using ::com::sun::star::awt::XControl;
93cdf0e10cSrcweir     /** === end UNO using === **/
94cdf0e10cSrcweir     namespace PosSize = ::com::sun::star::awt::PosSize;
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 	//==================================================================================================================
97cdf0e10cSrcweir 	//= helpers
98cdf0e10cSrcweir 	//==================================================================================================================
99cdf0e10cSrcweir     namespace
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir 	    //--------------------------------------------------------------------------------------------------------------
lcl_getModuleUIElementStatesConfig(const::rtl::OUString & i_rModuleIdentifier,const::rtl::OUString & i_rResourceURL=::rtl::OUString ())102cdf0e10cSrcweir         ::utl::OConfigurationTreeRoot lcl_getModuleUIElementStatesConfig( const ::rtl::OUString& i_rModuleIdentifier,
103cdf0e10cSrcweir             const ::rtl::OUString& i_rResourceURL = ::rtl::OUString() )
104cdf0e10cSrcweir         {
105cdf0e10cSrcweir             const ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
106cdf0e10cSrcweir             ::rtl::OUStringBuffer aPathComposer;
107cdf0e10cSrcweir             try
108cdf0e10cSrcweir             {
109cdf0e10cSrcweir                 const Reference< XNameAccess > xModuleAccess( aContext.createComponent( "com.sun.star.frame.ModuleManager" ), UNO_QUERY_THROW );
110cdf0e10cSrcweir                 const ::comphelper::NamedValueCollection aModuleProps( xModuleAccess->getByName( i_rModuleIdentifier ) );
111cdf0e10cSrcweir 
112cdf0e10cSrcweir                 const ::rtl::OUString sWindowStateRef( aModuleProps.getOrDefault( "ooSetupFactoryWindowStateConfigRef", ::rtl::OUString() ) );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir                 aPathComposer.appendAscii( "org.openoffice.Office.UI." );
115cdf0e10cSrcweir                 aPathComposer.append( sWindowStateRef );
116cdf0e10cSrcweir                 aPathComposer.appendAscii( "/UIElements/States" );
117cdf0e10cSrcweir                 if ( i_rResourceURL.getLength() )
118cdf0e10cSrcweir                 {
119cdf0e10cSrcweir                     aPathComposer.appendAscii( "/" );
120cdf0e10cSrcweir                     aPathComposer.append( i_rResourceURL );
121cdf0e10cSrcweir                 }
122cdf0e10cSrcweir             }
123cdf0e10cSrcweir             catch( const Exception& )
124cdf0e10cSrcweir             {
125cdf0e10cSrcweir         	    DBG_UNHANDLED_EXCEPTION();
126cdf0e10cSrcweir             }
127cdf0e10cSrcweir             return ::utl::OConfigurationTreeRoot( aContext, aPathComposer.makeStringAndClear(), false );
128cdf0e10cSrcweir         }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	    //--------------------------------------------------------------------------------------------------------------
lcl_identifyModule(const Reference<XFrame> & i_rDocumentFrame)131cdf0e10cSrcweir         ::rtl::OUString lcl_identifyModule( const Reference< XFrame >& i_rDocumentFrame )
132cdf0e10cSrcweir         {
133cdf0e10cSrcweir             ::rtl::OUString sModuleName;
134cdf0e10cSrcweir             try
135cdf0e10cSrcweir             {
136cdf0e10cSrcweir                 const ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
137cdf0e10cSrcweir                 const Reference< XModuleManager > xModuleManager( aContext.createComponent( "com.sun.star.frame.ModuleManager" ), UNO_QUERY_THROW );
138cdf0e10cSrcweir                 sModuleName = xModuleManager->identify( i_rDocumentFrame );
139cdf0e10cSrcweir             }
140cdf0e10cSrcweir             catch( const Exception& )
141cdf0e10cSrcweir             {
142cdf0e10cSrcweir             	DBG_UNHANDLED_EXCEPTION();
143cdf0e10cSrcweir             }
144cdf0e10cSrcweir             return sModuleName;
145cdf0e10cSrcweir         }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 	    //--------------------------------------------------------------------------------------------------------------
lcl_getFrame(const SfxBindings * i_pBindings)148cdf0e10cSrcweir         Reference< XFrame > lcl_getFrame( const SfxBindings* i_pBindings )
149cdf0e10cSrcweir         {
150cdf0e10cSrcweir             const SfxViewFrame* pViewFrame = i_pBindings->GetDispatcher()->GetFrame();
151cdf0e10cSrcweir             const SfxFrame& rFrame = pViewFrame->GetFrame();
152cdf0e10cSrcweir             const Reference< XFrame > xFrame( rFrame.GetFrameInterface() );
153cdf0e10cSrcweir             return xFrame;
154cdf0e10cSrcweir         }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 	    //--------------------------------------------------------------------------------------------------------------
lcl_getPanelHelpURL(const::utl::OConfigurationNode & i_rPanelConfigNode)157cdf0e10cSrcweir         ::rtl::OUString lcl_getPanelHelpURL( const ::utl::OConfigurationNode& i_rPanelConfigNode )
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir             const ::rtl::OUString sHelpURL( ::comphelper::getString( i_rPanelConfigNode.getNodeValue( "HelpURL" ) ) );
160cdf0e10cSrcweir             return sHelpURL;
161cdf0e10cSrcweir         }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 	    //--------------------------------------------------------------------------------------------------------------
lcl_getPanelImage(const Reference<XFrame> & i_rDocFrame,const::utl::OConfigurationNode & i_rPanelConfigNode)164cdf0e10cSrcweir         Image lcl_getPanelImage( const Reference< XFrame >& i_rDocFrame, const ::utl::OConfigurationNode& i_rPanelConfigNode )
165cdf0e10cSrcweir         {
166cdf0e10cSrcweir             const ::rtl::OUString sImageURL( ::comphelper::getString( i_rPanelConfigNode.getNodeValue( "ImageURL" ) ) );
167cdf0e10cSrcweir             if ( sImageURL.getLength() )
168cdf0e10cSrcweir             {
169cdf0e10cSrcweir                 try
170cdf0e10cSrcweir                 {
171cdf0e10cSrcweir                     ::comphelper::NamedValueCollection aMediaProperties;
172cdf0e10cSrcweir                     aMediaProperties.put( "URL", sImageURL );
173cdf0e10cSrcweir 
174cdf0e10cSrcweir                     // special handling: if the ImageURL denotes a CommandName, then retrieve the image for that command
175cdf0e10cSrcweir                     const sal_Char* pCommandImagePrefix = "private:commandimage/";
176cdf0e10cSrcweir                     const sal_Int32 nCommandImagePrefixLen = strlen( pCommandImagePrefix );
177cdf0e10cSrcweir                     if ( sImageURL.compareToAscii( pCommandImagePrefix, nCommandImagePrefixLen ) == 0 )
178cdf0e10cSrcweir                     {
179cdf0e10cSrcweir                         ::rtl::OUStringBuffer aCommandName;
180cdf0e10cSrcweir                         aCommandName.appendAscii( ".uno:" );
181cdf0e10cSrcweir                         aCommandName.append( sImageURL.copy( nCommandImagePrefixLen ) );
182cdf0e10cSrcweir                         const ::rtl::OUString sCommandName( aCommandName.makeStringAndClear() );
183cdf0e10cSrcweir 
184cdf0e10cSrcweir                         const sal_Bool bHiContrast( Application::GetSettings().GetStyleSettings().GetHighContrastMode() );
185cdf0e10cSrcweir                         const Image aPanelImage( GetImage( i_rDocFrame, sCommandName, sal_False, bHiContrast ) );
186cdf0e10cSrcweir                         return aPanelImage.GetXGraphic();
187cdf0e10cSrcweir                     }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir                     // otherwise, delegate to the GraphicProvider
190cdf0e10cSrcweir                     const ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
191cdf0e10cSrcweir                     const Reference< XGraphicProvider > xGraphicProvider( aContext.createComponent( "com.sun.star.graphic.GraphicProvider" ), UNO_QUERY_THROW );
192cdf0e10cSrcweir 
193cdf0e10cSrcweir                     const Reference< XGraphic > xGraphic( xGraphicProvider->queryGraphic( aMediaProperties.getPropertyValues() ), UNO_SET_THROW );
194cdf0e10cSrcweir                     return Image( xGraphic );
195cdf0e10cSrcweir                 }
196cdf0e10cSrcweir                 catch( const Exception& )
197cdf0e10cSrcweir                 {
198cdf0e10cSrcweir             	    DBG_UNHANDLED_EXCEPTION();
199cdf0e10cSrcweir                 }
200cdf0e10cSrcweir             }
201cdf0e10cSrcweir             return Image();
202cdf0e10cSrcweir         }
203cdf0e10cSrcweir     }
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 	//==================================================================================================================
206cdf0e10cSrcweir 	//= TaskPaneDockingWindow
207cdf0e10cSrcweir 	//==================================================================================================================
208cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
TaskPaneDockingWindow(SfxBindings * i_pBindings,TaskPaneWrapper & i_rWrapper,Window * i_pParent,WinBits i_nBits)209cdf0e10cSrcweir     TaskPaneDockingWindow::TaskPaneDockingWindow( SfxBindings* i_pBindings, TaskPaneWrapper& i_rWrapper, Window* i_pParent, WinBits i_nBits )
210cdf0e10cSrcweir         :TitledDockingWindow( i_pBindings, &i_rWrapper, i_pParent, i_nBits )
211cdf0e10cSrcweir         ,m_aTaskPane( GetContentWindow(), lcl_getFrame( i_pBindings ) )
212cdf0e10cSrcweir         ,m_aPaneController( m_aTaskPane, *this )
213cdf0e10cSrcweir     {
214cdf0e10cSrcweir         m_aTaskPane.Show();
215cdf0e10cSrcweir         SetText( String( SfxResId( SID_TASKPANE ) ) );
216cdf0e10cSrcweir     }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ActivateToolPanel(const::rtl::OUString & i_rPanelURL)219cdf0e10cSrcweir     void TaskPaneDockingWindow::ActivateToolPanel( const ::rtl::OUString& i_rPanelURL )
220cdf0e10cSrcweir     {
221cdf0e10cSrcweir         m_aPaneController.ActivateToolPanel( i_rPanelURL );
222cdf0e10cSrcweir     }
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetFocus()225cdf0e10cSrcweir     void TaskPaneDockingWindow::GetFocus()
226cdf0e10cSrcweir     {
227cdf0e10cSrcweir         TitledDockingWindow::GetFocus();
228cdf0e10cSrcweir         m_aTaskPane.GrabFocus();
229cdf0e10cSrcweir     }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
onLayoutDone()232cdf0e10cSrcweir     void TaskPaneDockingWindow::onLayoutDone()
233cdf0e10cSrcweir     {
234cdf0e10cSrcweir         m_aTaskPane.SetPosSizePixel( Point(), GetContentWindow().GetOutputSizePixel() );
235cdf0e10cSrcweir     }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 	//==================================================================================================================
238cdf0e10cSrcweir 	//= TaskPaneWrapper
239cdf0e10cSrcweir 	//==================================================================================================================
240cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
241cdf0e10cSrcweir     SFX_IMPL_DOCKINGWINDOW( TaskPaneWrapper, SID_TASKPANE );
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
TaskPaneWrapper(Window * i_pParent,sal_uInt16 i_nId,SfxBindings * i_pBindings,SfxChildWinInfo * i_pInfo)244cdf0e10cSrcweir     TaskPaneWrapper::TaskPaneWrapper( Window* i_pParent, sal_uInt16 i_nId, SfxBindings* i_pBindings, SfxChildWinInfo* i_pInfo )
245cdf0e10cSrcweir         :SfxChildWindow( i_pParent, i_nId )
246cdf0e10cSrcweir     {
247cdf0e10cSrcweir         pWindow = new TaskPaneDockingWindow( i_pBindings, *this, i_pParent,
248cdf0e10cSrcweir             WB_STDDOCKWIN | WB_CLIPCHILDREN | WB_SIZEABLE | WB_3DLOOK | WB_ROLLABLE);
249cdf0e10cSrcweir 	    eChildAlignment = SFX_ALIGN_RIGHT;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 	    pWindow->SetHelpId( HID_TASKPANE_WINDOW );
252cdf0e10cSrcweir         pWindow->SetOutputSizePixel( Size( 300, 450 ) );
253cdf0e10cSrcweir 
254cdf0e10cSrcweir         dynamic_cast< SfxDockingWindow* >( pWindow )->Initialize( i_pInfo );
255cdf0e10cSrcweir 	    SetHideNotDelete( sal_True );
256cdf0e10cSrcweir 
257cdf0e10cSrcweir         pWindow->Show();
258cdf0e10cSrcweir     }
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ActivateToolPanel(const::rtl::OUString & i_rPanelURL)261cdf0e10cSrcweir     void TaskPaneWrapper::ActivateToolPanel( const ::rtl::OUString& i_rPanelURL )
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         TaskPaneDockingWindow* pDockingWindow = dynamic_cast< TaskPaneDockingWindow* >( GetWindow() );
264cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( pDockingWindow, "TaskPaneWrapper::ActivateToolPanel: invalid docking window implementation!" );
265cdf0e10cSrcweir         pDockingWindow->ActivateToolPanel( i_rPanelURL );
266cdf0e10cSrcweir     }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir 	//==================================================================================================================
269cdf0e10cSrcweir 	//= CustomPanelUIElement
270cdf0e10cSrcweir 	//==================================================================================================================
271cdf0e10cSrcweir     class CustomPanelUIElement
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir     public:
CustomPanelUIElement()274cdf0e10cSrcweir         CustomPanelUIElement()
275cdf0e10cSrcweir             :m_xUIElement()
276cdf0e10cSrcweir             ,m_xToolPanel()
277cdf0e10cSrcweir             ,m_xPanelWindow()
278cdf0e10cSrcweir         {
279cdf0e10cSrcweir         }
280cdf0e10cSrcweir 
CustomPanelUIElement(const Reference<XUIElement> & i_rUIElement)281cdf0e10cSrcweir         CustomPanelUIElement( const Reference< XUIElement >& i_rUIElement )
282cdf0e10cSrcweir             :m_xUIElement( i_rUIElement, UNO_SET_THROW )
283cdf0e10cSrcweir             ,m_xToolPanel( i_rUIElement->getRealInterface(), UNO_QUERY_THROW )
284cdf0e10cSrcweir             ,m_xPanelWindow( m_xToolPanel->getWindow(), UNO_SET_THROW )
285cdf0e10cSrcweir         {
286cdf0e10cSrcweir         }
287cdf0e10cSrcweir 
is() const288cdf0e10cSrcweir         bool is() const { return m_xPanelWindow.is(); }
289cdf0e10cSrcweir 
getUIElement() const290cdf0e10cSrcweir         const Reference< XUIElement >&  getUIElement() const { return m_xUIElement; }
getToolPanel() const291cdf0e10cSrcweir         const Reference< XToolPanel >&  getToolPanel() const { return m_xToolPanel; }
getPanelWindow() const292cdf0e10cSrcweir         const Reference< XWindow >&     getPanelWindow() const { return m_xPanelWindow; }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     private:
295cdf0e10cSrcweir         Reference< XUIElement > m_xUIElement;
296cdf0e10cSrcweir         Reference< XToolPanel > m_xToolPanel;
297cdf0e10cSrcweir         Reference< XWindow >    m_xPanelWindow;
298cdf0e10cSrcweir     };
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 	//==================================================================================================================
301cdf0e10cSrcweir 	//= CustomToolPanel
302cdf0e10cSrcweir 	//==================================================================================================================
303cdf0e10cSrcweir     class CustomToolPanel : public ::svt::ToolPanelBase
304cdf0e10cSrcweir     {
305cdf0e10cSrcweir     public:
306cdf0e10cSrcweir         CustomToolPanel( const ::utl::OConfigurationNode& i_rPanelWindowState, const Reference< XFrame >& i_rFrame );
307cdf0e10cSrcweir 
308cdf0e10cSrcweir         virtual ::rtl::OUString GetDisplayName() const;
309cdf0e10cSrcweir         virtual Image GetImage() const;
310cdf0e10cSrcweir         virtual rtl::OString GetHelpID() const;
311cdf0e10cSrcweir         virtual void Activate( Window& i_rParentWindow );
312cdf0e10cSrcweir         virtual void Deactivate();
313cdf0e10cSrcweir         virtual void SetSizePixel( const Size& i_rPanelWindowSize );
314cdf0e10cSrcweir         virtual void GrabFocus();
315cdf0e10cSrcweir         virtual void Dispose();
316cdf0e10cSrcweir         virtual Reference< XAccessible >
317cdf0e10cSrcweir                     CreatePanelAccessible( const Reference< XAccessible >& i_rParentAccessible );
318cdf0e10cSrcweir 
319cdf0e10cSrcweir         const ::rtl::OUString&
GetResourceURL() const320cdf0e10cSrcweir                     GetResourceURL() const { return m_sResourceURL; }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir     protected:
323cdf0e10cSrcweir         ~CustomToolPanel();
324cdf0e10cSrcweir 
325cdf0e10cSrcweir     private:
326cdf0e10cSrcweir         bool    impl_ensureToolPanelWindow( Window& i_rPanelParentWindow );
327cdf0e10cSrcweir         void    impl_updatePanelConfig( const bool i_bVisible ) const;
328cdf0e10cSrcweir 
329cdf0e10cSrcweir     private:
330cdf0e10cSrcweir         const ::rtl::OUString   m_sUIName;
331cdf0e10cSrcweir         const Image             m_aPanelImage;
332cdf0e10cSrcweir         const ::rtl::OUString   m_aPanelHelpURL;
333cdf0e10cSrcweir         const ::rtl::OUString   m_sResourceURL;
334cdf0e10cSrcweir         const ::rtl::OUString   m_sPanelConfigPath;
335cdf0e10cSrcweir         Reference< XFrame >     m_xFrame;
336cdf0e10cSrcweir         CustomPanelUIElement    m_aCustomPanel;
337cdf0e10cSrcweir         bool                    m_bAttemptedCreation;
338cdf0e10cSrcweir     };
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
CustomToolPanel(const::utl::OConfigurationNode & i_rPanelWindowState,const Reference<XFrame> & i_rFrame)341cdf0e10cSrcweir     CustomToolPanel::CustomToolPanel( const ::utl::OConfigurationNode& i_rPanelWindowState, const Reference< XFrame >& i_rFrame )
342cdf0e10cSrcweir         :m_sUIName( ::comphelper::getString( i_rPanelWindowState.getNodeValue( "UIName" ) ) )
343cdf0e10cSrcweir         ,m_aPanelImage( lcl_getPanelImage( i_rFrame, i_rPanelWindowState ) )
344cdf0e10cSrcweir         ,m_aPanelHelpURL( lcl_getPanelHelpURL( i_rPanelWindowState ) )
345cdf0e10cSrcweir         ,m_sResourceURL( i_rPanelWindowState.getLocalName() )
346cdf0e10cSrcweir         ,m_sPanelConfigPath( i_rPanelWindowState.getNodePath() )
347cdf0e10cSrcweir         ,m_xFrame( i_rFrame )
348cdf0e10cSrcweir         ,m_aCustomPanel()
349cdf0e10cSrcweir         ,m_bAttemptedCreation( false )
350cdf0e10cSrcweir     {
351cdf0e10cSrcweir     }
352cdf0e10cSrcweir 
353cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
~CustomToolPanel()354cdf0e10cSrcweir     CustomToolPanel::~CustomToolPanel()
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir     }
357cdf0e10cSrcweir 
358cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
impl_ensureToolPanelWindow(Window & i_rPanelParentWindow)359cdf0e10cSrcweir     bool CustomToolPanel::impl_ensureToolPanelWindow( Window& i_rPanelParentWindow )
360cdf0e10cSrcweir     {
361cdf0e10cSrcweir         if ( m_bAttemptedCreation )
362cdf0e10cSrcweir             return m_aCustomPanel.is();
363cdf0e10cSrcweir 
364cdf0e10cSrcweir         m_bAttemptedCreation = true;
365cdf0e10cSrcweir         try
366cdf0e10cSrcweir         {
367cdf0e10cSrcweir             const ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
368cdf0e10cSrcweir             const Reference< XUIElementFactory > xFactory( aContext.createComponent( "com.sun.star.ui.UIElementFactoryManager" ), UNO_QUERY_THROW );
369cdf0e10cSrcweir 
370cdf0e10cSrcweir             ::comphelper::NamedValueCollection aCreationArgs;
371cdf0e10cSrcweir             aCreationArgs.put( "Frame", makeAny( m_xFrame ) );
372cdf0e10cSrcweir             aCreationArgs.put( "ParentWindow", makeAny( i_rPanelParentWindow.GetComponentInterface() ) );
373cdf0e10cSrcweir 
374cdf0e10cSrcweir             const Reference< XUIElement > xElement(
375cdf0e10cSrcweir                 xFactory->createUIElement( m_sResourceURL, aCreationArgs.getPropertyValues() ),
376cdf0e10cSrcweir                 UNO_SET_THROW );
377cdf0e10cSrcweir 
378cdf0e10cSrcweir             m_aCustomPanel = CustomPanelUIElement( xElement );
379cdf0e10cSrcweir         }
380cdf0e10cSrcweir         catch( const Exception& )
381cdf0e10cSrcweir         {
382cdf0e10cSrcweir         	DBG_UNHANDLED_EXCEPTION();
383cdf0e10cSrcweir         }
384cdf0e10cSrcweir         return m_aCustomPanel.is();
385cdf0e10cSrcweir     }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
impl_updatePanelConfig(const bool i_bVisible) const388cdf0e10cSrcweir     void CustomToolPanel::impl_updatePanelConfig( const bool i_bVisible ) const
389cdf0e10cSrcweir     {
390cdf0e10cSrcweir         ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
391cdf0e10cSrcweir         ::utl::OConfigurationTreeRoot aConfig( aContext, m_sPanelConfigPath, true );
392cdf0e10cSrcweir 
393cdf0e10cSrcweir         aConfig.setNodeValue( "Visible", makeAny( i_bVisible ) );
394cdf0e10cSrcweir         aConfig.commit();
395cdf0e10cSrcweir     }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
GetDisplayName() const398cdf0e10cSrcweir     ::rtl::OUString CustomToolPanel::GetDisplayName() const
399cdf0e10cSrcweir     {
400cdf0e10cSrcweir         return m_sUIName;
401cdf0e10cSrcweir     }
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
GetImage() const404cdf0e10cSrcweir     Image CustomToolPanel::GetImage() const
405cdf0e10cSrcweir     {
406cdf0e10cSrcweir         return m_aPanelImage;
407cdf0e10cSrcweir     }
408cdf0e10cSrcweir 
lcl_getHelpId(const::rtl::OUString & _rHelpURL)409cdf0e10cSrcweir 	static rtl::OString lcl_getHelpId( const ::rtl::OUString& _rHelpURL )
410cdf0e10cSrcweir     {
411cdf0e10cSrcweir         INetURLObject aHID( _rHelpURL );
412cdf0e10cSrcweir         if ( aHID.GetProtocol() == INET_PROT_HID )
413cdf0e10cSrcweir             return rtl::OUStringToOString( aHID.GetURLPath(), RTL_TEXTENCODING_UTF8 );
414cdf0e10cSrcweir         else
415cdf0e10cSrcweir             return rtl::OUStringToOString( _rHelpURL, RTL_TEXTENCODING_UTF8 );
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
GetHelpID() const419cdf0e10cSrcweir     rtl::OString CustomToolPanel::GetHelpID() const
420cdf0e10cSrcweir     {
421cdf0e10cSrcweir         return lcl_getHelpId( m_aPanelHelpURL );
422cdf0e10cSrcweir     }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
Activate(Window & i_rParentWindow)425cdf0e10cSrcweir     void CustomToolPanel::Activate( Window& i_rParentWindow )
426cdf0e10cSrcweir     {
427cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( impl_ensureToolPanelWindow( i_rParentWindow ), "no panel to activate!" );
428cdf0e10cSrcweir 
429cdf0e10cSrcweir         // TODO: we might need a mechanism to decide whether the panel should be destroyed/re-created, or (as it is
430cdf0e10cSrcweir         // done now) hidden/shown
431cdf0e10cSrcweir         m_aCustomPanel.getPanelWindow()->setVisible( sal_True );
432cdf0e10cSrcweir 
433cdf0e10cSrcweir         // update the panel's configuration
434cdf0e10cSrcweir         impl_updatePanelConfig( true );
435cdf0e10cSrcweir     }
436cdf0e10cSrcweir 
437cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
Deactivate()438cdf0e10cSrcweir     void CustomToolPanel::Deactivate()
439cdf0e10cSrcweir     {
440cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_aCustomPanel.is(), "no panel to deactivate!" );
441cdf0e10cSrcweir 
442cdf0e10cSrcweir         m_aCustomPanel.getPanelWindow()->setVisible( sal_False );
443cdf0e10cSrcweir 
444cdf0e10cSrcweir         // update the panel's configuration
445cdf0e10cSrcweir         impl_updatePanelConfig( false );
446cdf0e10cSrcweir     }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
SetSizePixel(const Size & i_rPanelWindowSize)449cdf0e10cSrcweir     void CustomToolPanel::SetSizePixel( const Size& i_rPanelWindowSize )
450cdf0e10cSrcweir     {
451cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_aCustomPanel.is(), "no panel/window to position!" );
452cdf0e10cSrcweir 
453cdf0e10cSrcweir         try
454cdf0e10cSrcweir         {
455cdf0e10cSrcweir             m_aCustomPanel.getPanelWindow()->setPosSize( 0, 0, i_rPanelWindowSize.Width(), i_rPanelWindowSize.Height(),
456cdf0e10cSrcweir                 PosSize::POSSIZE );
457cdf0e10cSrcweir         }
458cdf0e10cSrcweir         catch( const Exception& )
459cdf0e10cSrcweir         {
460cdf0e10cSrcweir         	DBG_UNHANDLED_EXCEPTION();
461cdf0e10cSrcweir         }
462cdf0e10cSrcweir     }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
GrabFocus()465cdf0e10cSrcweir     void CustomToolPanel::GrabFocus()
466cdf0e10cSrcweir     {
467cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_aCustomPanel.is(), "no panel/window to focus!" );
468cdf0e10cSrcweir 
469cdf0e10cSrcweir         m_aCustomPanel.getPanelWindow()->setFocus();
470cdf0e10cSrcweir     }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
Dispose()473cdf0e10cSrcweir     void CustomToolPanel::Dispose()
474cdf0e10cSrcweir     {
475cdf0e10cSrcweir         if ( !m_bAttemptedCreation )
476cdf0e10cSrcweir             // nothing to dispose
477cdf0e10cSrcweir             return;
478cdf0e10cSrcweir 
479cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_aCustomPanel.is(), "no panel to destroy!" );
480cdf0e10cSrcweir         try
481cdf0e10cSrcweir         {
482cdf0e10cSrcweir             Reference< XComponent > xUIElementComponent( m_aCustomPanel.getUIElement(), UNO_QUERY_THROW );
483cdf0e10cSrcweir             xUIElementComponent->dispose();
484cdf0e10cSrcweir         }
485cdf0e10cSrcweir         catch( const Exception& )
486cdf0e10cSrcweir         {
487cdf0e10cSrcweir         	DBG_UNHANDLED_EXCEPTION();
488cdf0e10cSrcweir         }
489cdf0e10cSrcweir     }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
CreatePanelAccessible(const Reference<XAccessible> & i_rParentAccessible)492cdf0e10cSrcweir     Reference< XAccessible > CustomToolPanel::CreatePanelAccessible( const Reference< XAccessible >& i_rParentAccessible )
493cdf0e10cSrcweir     {
494cdf0e10cSrcweir         ENSURE_OR_RETURN( m_aCustomPanel.is(), "no panel to ask!", NULL );
495cdf0e10cSrcweir 
496cdf0e10cSrcweir         Reference< XAccessible > xPanelAccessible;
497cdf0e10cSrcweir         try
498cdf0e10cSrcweir         {
499cdf0e10cSrcweir             xPanelAccessible.set( m_aCustomPanel.getToolPanel()->createAccessible( i_rParentAccessible ), UNO_SET_THROW );
500cdf0e10cSrcweir         }
501cdf0e10cSrcweir         catch( const Exception& )
502cdf0e10cSrcweir         {
503cdf0e10cSrcweir         	DBG_UNHANDLED_EXCEPTION();
504cdf0e10cSrcweir         }
505cdf0e10cSrcweir         return xPanelAccessible;
506cdf0e10cSrcweir     }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 	//==================================================================================================================
509cdf0e10cSrcweir 	//= ModuleTaskPane_Impl
510cdf0e10cSrcweir 	//==================================================================================================================
511cdf0e10cSrcweir     class ModuleTaskPane_Impl : public ::boost::noncopyable
512cdf0e10cSrcweir     {
513cdf0e10cSrcweir     public:
ModuleTaskPane_Impl(ModuleTaskPane & i_rAntiImpl,const Reference<XFrame> & i_rDocumentFrame,const IToolPanelCompare * i_pPanelCompare)514cdf0e10cSrcweir         ModuleTaskPane_Impl( ModuleTaskPane& i_rAntiImpl, const Reference< XFrame >& i_rDocumentFrame,
515cdf0e10cSrcweir                 const IToolPanelCompare* i_pPanelCompare )
516cdf0e10cSrcweir             :m_rAntiImpl( i_rAntiImpl )
517cdf0e10cSrcweir             ,m_sModuleIdentifier( lcl_identifyModule( i_rDocumentFrame ) )
518cdf0e10cSrcweir             ,m_xFrame( i_rDocumentFrame )
519cdf0e10cSrcweir             ,m_aPanelDeck( i_rAntiImpl )
520cdf0e10cSrcweir         {
521cdf0e10cSrcweir             m_aPanelDeck.Show();
522cdf0e10cSrcweir             OnResize();
523cdf0e10cSrcweir             impl_initFromConfiguration( i_pPanelCompare );
524cdf0e10cSrcweir         }
525cdf0e10cSrcweir 
~ModuleTaskPane_Impl()526cdf0e10cSrcweir         ~ModuleTaskPane_Impl()
527cdf0e10cSrcweir         {
528cdf0e10cSrcweir         }
529cdf0e10cSrcweir 
530cdf0e10cSrcweir         void    OnResize();
531cdf0e10cSrcweir         void    OnGetFocus();
532cdf0e10cSrcweir 
533cdf0e10cSrcweir         static bool ModuleHasToolPanels( const ::rtl::OUString& i_rModuleIdentifier );
534cdf0e10cSrcweir 
GetPanelDeck()535cdf0e10cSrcweir               ::svt::ToolPanelDeck& GetPanelDeck()          { return m_aPanelDeck; }
GetPanelDeck() const536cdf0e10cSrcweir         const ::svt::ToolPanelDeck& GetPanelDeck() const    { return m_aPanelDeck; }
537cdf0e10cSrcweir 
538cdf0e10cSrcweir         ::boost::optional< size_t >
539cdf0e10cSrcweir                     GetPanelPos( const ::rtl::OUString& i_rResourceURL );
540cdf0e10cSrcweir         ::rtl::OUString
541cdf0e10cSrcweir                     GetPanelResourceURL( const size_t i_nPanelPos ) const;
542cdf0e10cSrcweir 
543cdf0e10cSrcweir         void        SetDrawersLayout();
544cdf0e10cSrcweir         void        SetTabsLayout( const ::svt::TabAlignment i_eTabAlignment, const ::svt::TabItemContent i_eTabContent );
545cdf0e10cSrcweir 
546cdf0e10cSrcweir     private:
547cdf0e10cSrcweir         void    impl_initFromConfiguration( const IToolPanelCompare* i_pPanelCompare );
548cdf0e10cSrcweir 
549cdf0e10cSrcweir         static bool
550cdf0e10cSrcweir                 impl_isToolPanelResource( const ::rtl::OUString& i_rResourceURL );
551cdf0e10cSrcweir 
552cdf0e10cSrcweir         DECL_LINK( OnActivatePanel, void* );
553cdf0e10cSrcweir 
554cdf0e10cSrcweir     private:
555cdf0e10cSrcweir         ModuleTaskPane&             m_rAntiImpl;
556cdf0e10cSrcweir         const ::rtl::OUString       m_sModuleIdentifier;
557cdf0e10cSrcweir         const Reference< XFrame >   m_xFrame;
558cdf0e10cSrcweir         ::svt::ToolPanelDeck        m_aPanelDeck;
559cdf0e10cSrcweir     };
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
OnResize()562cdf0e10cSrcweir     void ModuleTaskPane_Impl::OnResize()
563cdf0e10cSrcweir     {
564cdf0e10cSrcweir         m_aPanelDeck.SetPosSizePixel( Point(), m_rAntiImpl.GetOutputSizePixel() );
565cdf0e10cSrcweir     }
566cdf0e10cSrcweir 
567cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
OnGetFocus()568cdf0e10cSrcweir     void ModuleTaskPane_Impl::OnGetFocus()
569cdf0e10cSrcweir     {
570cdf0e10cSrcweir         m_aPanelDeck.GrabFocus();
571cdf0e10cSrcweir     }
572cdf0e10cSrcweir 
573cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
IMPL_LINK(ModuleTaskPane_Impl,OnActivatePanel,void *,i_pArg)574cdf0e10cSrcweir     IMPL_LINK( ModuleTaskPane_Impl, OnActivatePanel, void*, i_pArg )
575cdf0e10cSrcweir     {
576cdf0e10cSrcweir         m_aPanelDeck.ActivatePanel( reinterpret_cast< size_t >( i_pArg ) );
577cdf0e10cSrcweir         return 1L;
578cdf0e10cSrcweir     }
579cdf0e10cSrcweir 
580cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
impl_isToolPanelResource(const::rtl::OUString & i_rResourceURL)581cdf0e10cSrcweir     bool ModuleTaskPane_Impl::impl_isToolPanelResource( const ::rtl::OUString& i_rResourceURL )
582cdf0e10cSrcweir     {
583cdf0e10cSrcweir         return i_rResourceURL.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "private:resource/toolpanel/" ) );
584cdf0e10cSrcweir     }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
impl_initFromConfiguration(const IToolPanelCompare * i_pPanelCompare)587cdf0e10cSrcweir     void ModuleTaskPane_Impl::impl_initFromConfiguration( const IToolPanelCompare* i_pPanelCompare )
588cdf0e10cSrcweir     {
589cdf0e10cSrcweir         const ::utl::OConfigurationTreeRoot aWindowStateConfig( lcl_getModuleUIElementStatesConfig( m_sModuleIdentifier ) );
590cdf0e10cSrcweir         if ( !aWindowStateConfig.isValid() )
591cdf0e10cSrcweir             return;
592cdf0e10cSrcweir 
593cdf0e10cSrcweir         ::rtl::OUString sFirstVisiblePanelResource;
594cdf0e10cSrcweir         ::rtl::OUString sFirstPanelResource;
595cdf0e10cSrcweir 
596cdf0e10cSrcweir         const Sequence< ::rtl::OUString > aUIElements( aWindowStateConfig.getNodeNames() );
597cdf0e10cSrcweir         for (   const ::rtl::OUString* resource = aUIElements.getConstArray();
598cdf0e10cSrcweir                 resource != aUIElements.getConstArray() + aUIElements.getLength();
599cdf0e10cSrcweir                 ++resource
600cdf0e10cSrcweir             )
601cdf0e10cSrcweir         {
602cdf0e10cSrcweir             if ( !impl_isToolPanelResource( *resource ) )
603cdf0e10cSrcweir                 continue;
604cdf0e10cSrcweir 
605cdf0e10cSrcweir             sFirstPanelResource = *resource;
606cdf0e10cSrcweir 
607cdf0e10cSrcweir             ::utl::OConfigurationNode aResourceNode( aWindowStateConfig.openNode( *resource ) );
608cdf0e10cSrcweir             ::svt::PToolPanel pCustomPanel( new CustomToolPanel( aResourceNode, m_xFrame ) );
609cdf0e10cSrcweir 
610cdf0e10cSrcweir             size_t nPanelPos = m_aPanelDeck.GetPanelCount();
611cdf0e10cSrcweir             if ( i_pPanelCompare )
612cdf0e10cSrcweir             {
613cdf0e10cSrcweir                 // assuming that nobody will insert hundreths of panels, a simple O(n) search should suffice here ...
614cdf0e10cSrcweir                 while ( nPanelPos > 0 )
615cdf0e10cSrcweir                 {
616cdf0e10cSrcweir                     const short nCompare = i_pPanelCompare->compareToolPanelsURLs(
617cdf0e10cSrcweir                         *resource,
618cdf0e10cSrcweir                         GetPanelResourceURL( --nPanelPos )
619cdf0e10cSrcweir                     );
620cdf0e10cSrcweir                     if ( nCompare >= 0 )
621cdf0e10cSrcweir                     {
622cdf0e10cSrcweir                         ++nPanelPos;
623cdf0e10cSrcweir                         break;
624cdf0e10cSrcweir                     }
625cdf0e10cSrcweir                 }
626cdf0e10cSrcweir             }
627cdf0e10cSrcweir             nPanelPos = m_aPanelDeck.InsertPanel( pCustomPanel, nPanelPos );
628cdf0e10cSrcweir 
629cdf0e10cSrcweir             if ( ::comphelper::getBOOL( aResourceNode.getNodeValue( "Visible" ) ) )
630cdf0e10cSrcweir                 sFirstVisiblePanelResource = *resource;
631cdf0e10cSrcweir         }
632cdf0e10cSrcweir 
633cdf0e10cSrcweir         if ( sFirstVisiblePanelResource.getLength() == 0 )
634cdf0e10cSrcweir             sFirstVisiblePanelResource = sFirstPanelResource;
635cdf0e10cSrcweir 
636cdf0e10cSrcweir         if ( sFirstVisiblePanelResource.getLength() )
637cdf0e10cSrcweir         {
638cdf0e10cSrcweir             ::boost::optional< size_t > aPanelPos( GetPanelPos( sFirstVisiblePanelResource ) );
639cdf0e10cSrcweir             OSL_ENSURE( !!aPanelPos, "ModuleTaskPane_Impl::impl_isToolPanelResource: just inserted it, and it's not there?!" );
640cdf0e10cSrcweir             if ( !!aPanelPos )
641cdf0e10cSrcweir                 m_rAntiImpl.PostUserEvent( LINK( this, ModuleTaskPane_Impl, OnActivatePanel ), reinterpret_cast< void* >( *aPanelPos ) );
642cdf0e10cSrcweir         }
643cdf0e10cSrcweir     }
644cdf0e10cSrcweir 
645cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ModuleHasToolPanels(const::rtl::OUString & i_rModuleIdentifier)646cdf0e10cSrcweir     bool ModuleTaskPane_Impl::ModuleHasToolPanels( const ::rtl::OUString& i_rModuleIdentifier )
647cdf0e10cSrcweir     {
648cdf0e10cSrcweir         const ::utl::OConfigurationTreeRoot aWindowStateConfig( lcl_getModuleUIElementStatesConfig( i_rModuleIdentifier ) );
649cdf0e10cSrcweir         if ( !aWindowStateConfig.isValid() )
650cdf0e10cSrcweir             return false;
651cdf0e10cSrcweir 
652cdf0e10cSrcweir         const Sequence< ::rtl::OUString > aUIElements( aWindowStateConfig.getNodeNames() );
653cdf0e10cSrcweir         for (   const ::rtl::OUString* resource = aUIElements.getConstArray();
654cdf0e10cSrcweir                 resource != aUIElements.getConstArray() + aUIElements.getLength();
655cdf0e10cSrcweir                 ++resource
656cdf0e10cSrcweir             )
657cdf0e10cSrcweir         {
658cdf0e10cSrcweir             if ( impl_isToolPanelResource( *resource ) )
659cdf0e10cSrcweir                 return true;
660cdf0e10cSrcweir         }
661cdf0e10cSrcweir         return false;
662cdf0e10cSrcweir     }
663cdf0e10cSrcweir 
664cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetPanelPos(const::rtl::OUString & i_rResourceURL)665cdf0e10cSrcweir     ::boost::optional< size_t > ModuleTaskPane_Impl::GetPanelPos( const ::rtl::OUString& i_rResourceURL )
666cdf0e10cSrcweir     {
667cdf0e10cSrcweir         ::boost::optional< size_t > aPanelPos;
668cdf0e10cSrcweir         for ( size_t i = 0; i < m_aPanelDeck.GetPanelCount(); ++i )
669cdf0e10cSrcweir         {
670cdf0e10cSrcweir             const ::svt::PToolPanel pPanel( m_aPanelDeck.GetPanel( i ) );
671cdf0e10cSrcweir             const CustomToolPanel* pCustomPanel = dynamic_cast< const CustomToolPanel* >( pPanel.get() );
672cdf0e10cSrcweir             ENSURE_OR_CONTINUE( pCustomPanel != NULL, "ModuleTaskPane_Impl::GetPanelPos: illegal panel implementation!" );
673cdf0e10cSrcweir             if ( pCustomPanel->GetResourceURL() == i_rResourceURL )
674cdf0e10cSrcweir             {
675cdf0e10cSrcweir                 aPanelPos = i;
676cdf0e10cSrcweir                 break;
677cdf0e10cSrcweir             }
678cdf0e10cSrcweir         }
679cdf0e10cSrcweir         return aPanelPos;
680cdf0e10cSrcweir     }
681cdf0e10cSrcweir 
682cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetPanelResourceURL(const size_t i_nPanelPos) const683cdf0e10cSrcweir     ::rtl::OUString ModuleTaskPane_Impl::GetPanelResourceURL( const size_t i_nPanelPos ) const
684cdf0e10cSrcweir     {
685cdf0e10cSrcweir         ENSURE_OR_RETURN( i_nPanelPos < m_aPanelDeck.GetPanelCount(), "ModuleTaskPane_Impl::GetPanelResourceURL: illegal panel position!", ::rtl::OUString() );
686cdf0e10cSrcweir         const ::svt::PToolPanel pPanel( m_aPanelDeck.GetPanel( i_nPanelPos ) );
687cdf0e10cSrcweir         const CustomToolPanel* pCustomPanel = dynamic_cast< const CustomToolPanel* >( pPanel.get() );
688cdf0e10cSrcweir         ENSURE_OR_RETURN( pCustomPanel != NULL, "ModuleTaskPane_Impl::GetPanelPos: illegal panel implementation!", ::rtl::OUString() );
689cdf0e10cSrcweir         return pCustomPanel->GetResourceURL();
690cdf0e10cSrcweir     }
691cdf0e10cSrcweir 
692cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
SetDrawersLayout()693cdf0e10cSrcweir     void ModuleTaskPane_Impl::SetDrawersLayout()
694cdf0e10cSrcweir     {
695cdf0e10cSrcweir         const ::svt::PDeckLayouter pLayouter( m_aPanelDeck.GetLayouter() );
696cdf0e10cSrcweir         const ::svt::DrawerDeckLayouter* pDrawerLayouter = dynamic_cast< const ::svt::DrawerDeckLayouter* >( pLayouter.get() );
697cdf0e10cSrcweir         if ( pDrawerLayouter != NULL )
698cdf0e10cSrcweir             // already have the proper layout
699cdf0e10cSrcweir             return;
700cdf0e10cSrcweir         m_aPanelDeck.SetLayouter( new ::svt::DrawerDeckLayouter( m_aPanelDeck, m_aPanelDeck ) );
701cdf0e10cSrcweir     }
702cdf0e10cSrcweir 
703cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
SetTabsLayout(const::svt::TabAlignment i_eTabAlignment,const::svt::TabItemContent i_eTabContent)704cdf0e10cSrcweir     void ModuleTaskPane_Impl::SetTabsLayout( const ::svt::TabAlignment i_eTabAlignment, const ::svt::TabItemContent i_eTabContent )
705cdf0e10cSrcweir     {
706cdf0e10cSrcweir         ::svt::PDeckLayouter pLayouter( m_aPanelDeck.GetLayouter() );
707cdf0e10cSrcweir         ::svt::TabDeckLayouter* pTabLayouter = dynamic_cast< ::svt::TabDeckLayouter* >( pLayouter.get() );
708cdf0e10cSrcweir         if  (   ( pTabLayouter != NULL )
709cdf0e10cSrcweir             &&  ( pTabLayouter->GetTabAlignment() == i_eTabAlignment )
710cdf0e10cSrcweir             &&  ( pTabLayouter->GetTabItemContent() == i_eTabContent )
711cdf0e10cSrcweir             )
712cdf0e10cSrcweir             // already have the requested layout
713cdf0e10cSrcweir             return;
714cdf0e10cSrcweir 
715cdf0e10cSrcweir         if ( pTabLayouter && ( pTabLayouter->GetTabAlignment() == i_eTabAlignment ) )
716cdf0e10cSrcweir         {
717cdf0e10cSrcweir             // changing only the item content does not require a new layouter instance
718cdf0e10cSrcweir             pTabLayouter->SetTabItemContent( i_eTabContent );
719cdf0e10cSrcweir             return;
720cdf0e10cSrcweir         }
721cdf0e10cSrcweir 
722cdf0e10cSrcweir         m_aPanelDeck.SetLayouter( new ::svt::TabDeckLayouter( m_aPanelDeck, m_aPanelDeck, i_eTabAlignment, i_eTabContent ) );
723cdf0e10cSrcweir     }
724cdf0e10cSrcweir 
725cdf0e10cSrcweir 	//==================================================================================================================
726cdf0e10cSrcweir 	//= ModuleTaskPane
727cdf0e10cSrcweir 	//==================================================================================================================
728cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ModuleTaskPane(Window & i_rParentWindow,const Reference<XFrame> & i_rDocumentFrame)729cdf0e10cSrcweir     ModuleTaskPane::ModuleTaskPane( Window& i_rParentWindow, const Reference< XFrame >& i_rDocumentFrame )
730cdf0e10cSrcweir         :Window( &i_rParentWindow, WB_DIALOGCONTROL )
731cdf0e10cSrcweir         ,m_pImpl( new ModuleTaskPane_Impl( *this, i_rDocumentFrame, NULL ) )
732cdf0e10cSrcweir     {
733cdf0e10cSrcweir     }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ModuleTaskPane(Window & i_rParentWindow,const Reference<XFrame> & i_rDocumentFrame,const IToolPanelCompare & i_rCompare)736cdf0e10cSrcweir     ModuleTaskPane::ModuleTaskPane( Window& i_rParentWindow, const Reference< XFrame >& i_rDocumentFrame,
737cdf0e10cSrcweir             const IToolPanelCompare& i_rCompare )
738cdf0e10cSrcweir         :Window( &i_rParentWindow, WB_DIALOGCONTROL )
739cdf0e10cSrcweir         ,m_pImpl( new ModuleTaskPane_Impl( *this, i_rDocumentFrame, &i_rCompare ) )
740cdf0e10cSrcweir     {
741cdf0e10cSrcweir     }
742cdf0e10cSrcweir 
743cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
~ModuleTaskPane()744cdf0e10cSrcweir     ModuleTaskPane::~ModuleTaskPane()
745cdf0e10cSrcweir     {
746cdf0e10cSrcweir     }
747cdf0e10cSrcweir 
748cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ModuleHasToolPanels(const::rtl::OUString & i_rModuleIdentifier)749cdf0e10cSrcweir     bool ModuleTaskPane::ModuleHasToolPanels( const ::rtl::OUString& i_rModuleIdentifier )
750cdf0e10cSrcweir     {
751cdf0e10cSrcweir         return ModuleTaskPane_Impl::ModuleHasToolPanels( i_rModuleIdentifier );
752cdf0e10cSrcweir     }
753cdf0e10cSrcweir 
754cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ModuleHasToolPanels(const Reference<XFrame> & i_rDocumentFrame)755cdf0e10cSrcweir     bool ModuleTaskPane::ModuleHasToolPanels( const Reference< XFrame >& i_rDocumentFrame )
756cdf0e10cSrcweir     {
757cdf0e10cSrcweir         return ModuleTaskPane_Impl::ModuleHasToolPanels( lcl_identifyModule( i_rDocumentFrame ) );
758cdf0e10cSrcweir     }
759cdf0e10cSrcweir 
760cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
Resize()761cdf0e10cSrcweir     void ModuleTaskPane::Resize()
762cdf0e10cSrcweir     {
763cdf0e10cSrcweir         Window::Resize();
764cdf0e10cSrcweir         m_pImpl->OnResize();
765cdf0e10cSrcweir     }
766cdf0e10cSrcweir 
767cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetFocus()768cdf0e10cSrcweir     void ModuleTaskPane::GetFocus()
769cdf0e10cSrcweir     {
770cdf0e10cSrcweir         Window::GetFocus();
771cdf0e10cSrcweir         m_pImpl->OnGetFocus();
772cdf0e10cSrcweir     }
773cdf0e10cSrcweir 
774cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetPanelDeck()775cdf0e10cSrcweir     ::svt::ToolPanelDeck& ModuleTaskPane::GetPanelDeck()
776cdf0e10cSrcweir     {
777cdf0e10cSrcweir         return m_pImpl->GetPanelDeck();
778cdf0e10cSrcweir     }
779cdf0e10cSrcweir 
780cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetPanelDeck() const781cdf0e10cSrcweir     const ::svt::ToolPanelDeck& ModuleTaskPane::GetPanelDeck() const
782cdf0e10cSrcweir     {
783cdf0e10cSrcweir         return m_pImpl->GetPanelDeck();
784cdf0e10cSrcweir     }
785cdf0e10cSrcweir 
786cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetPanelPos(const::rtl::OUString & i_rResourceURL)787cdf0e10cSrcweir     ::boost::optional< size_t > ModuleTaskPane::GetPanelPos( const ::rtl::OUString& i_rResourceURL )
788cdf0e10cSrcweir     {
789cdf0e10cSrcweir         return m_pImpl->GetPanelPos( i_rResourceURL );
790cdf0e10cSrcweir     }
791cdf0e10cSrcweir 
792cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
GetPanelResourceURL(const size_t i_nPanelPos) const793cdf0e10cSrcweir     ::rtl::OUString ModuleTaskPane::GetPanelResourceURL( const size_t i_nPanelPos ) const
794cdf0e10cSrcweir     {
795cdf0e10cSrcweir         return m_pImpl->GetPanelResourceURL( i_nPanelPos );
796cdf0e10cSrcweir     }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
SetDrawersLayout()799cdf0e10cSrcweir     void ModuleTaskPane::SetDrawersLayout()
800cdf0e10cSrcweir     {
801cdf0e10cSrcweir         m_pImpl->SetDrawersLayout();
802cdf0e10cSrcweir     }
803cdf0e10cSrcweir 
804cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
SetTabsLayout(const::svt::TabAlignment i_eTabAlignment,const::svt::TabItemContent i_eTabContent)805cdf0e10cSrcweir     void ModuleTaskPane::SetTabsLayout( const ::svt::TabAlignment i_eTabAlignment, const ::svt::TabItemContent i_eTabContent )
806cdf0e10cSrcweir     {
807cdf0e10cSrcweir         m_pImpl->SetTabsLayout( i_eTabAlignment, i_eTabContent );
808cdf0e10cSrcweir     }
809cdf0e10cSrcweir 
810cdf0e10cSrcweir     // =====================================================================================================================
811cdf0e10cSrcweir     // = PanelSelectorLayout
812cdf0e10cSrcweir     // =====================================================================================================================
813cdf0e10cSrcweir     enum PanelSelectorLayout
814cdf0e10cSrcweir     {
815cdf0e10cSrcweir         LAYOUT_DRAWERS,
816cdf0e10cSrcweir         LAYOUT_TABS_RIGHT,
817cdf0e10cSrcweir         LAYOUT_TABS_LEFT,
818cdf0e10cSrcweir         LAYOUT_TABS_TOP,
819cdf0e10cSrcweir         LAYOUT_TABS_BOTTOM
820cdf0e10cSrcweir     };
821cdf0e10cSrcweir 
822cdf0e10cSrcweir 	//==================================================================================================================
823cdf0e10cSrcweir 	//= helper
824cdf0e10cSrcweir 	//==================================================================================================================
825cdf0e10cSrcweir     namespace
826cdf0e10cSrcweir     {
lcl_getTabLayoutFromAlignment(const SfxChildAlignment i_eAlignment)827cdf0e10cSrcweir         PanelSelectorLayout lcl_getTabLayoutFromAlignment( const SfxChildAlignment i_eAlignment )
828cdf0e10cSrcweir         {
829cdf0e10cSrcweir             switch ( i_eAlignment )
830cdf0e10cSrcweir             {
831cdf0e10cSrcweir             case SFX_ALIGN_LEFT:
832cdf0e10cSrcweir                 return LAYOUT_TABS_LEFT;
833cdf0e10cSrcweir             case SFX_ALIGN_TOP:
834cdf0e10cSrcweir                 return LAYOUT_TABS_TOP;
835cdf0e10cSrcweir             case SFX_ALIGN_BOTTOM:
836cdf0e10cSrcweir                 return LAYOUT_TABS_BOTTOM;
837cdf0e10cSrcweir             default:
838cdf0e10cSrcweir                 return LAYOUT_TABS_RIGHT;
839cdf0e10cSrcweir             }
840cdf0e10cSrcweir         }
841cdf0e10cSrcweir     }
842cdf0e10cSrcweir 
843cdf0e10cSrcweir     // =====================================================================================================================
844cdf0e10cSrcweir     // = PanelDescriptor
845cdf0e10cSrcweir     // =====================================================================================================================
846cdf0e10cSrcweir     /** is a helper class for TaskPaneController_Impl, holding the details about a single panel which is not
847cdf0e10cSrcweir         contained in the IToolPanel implementation itself.
848cdf0e10cSrcweir     */
849cdf0e10cSrcweir     struct PanelDescriptor
850cdf0e10cSrcweir     {
851cdf0e10cSrcweir         ::svt::PToolPanel   pPanel;
852cdf0e10cSrcweir         bool                bHidden;
853cdf0e10cSrcweir 
PanelDescriptorsfx2::PanelDescriptor854cdf0e10cSrcweir         PanelDescriptor()
855cdf0e10cSrcweir             :pPanel()
856cdf0e10cSrcweir             ,bHidden( false )
857cdf0e10cSrcweir         {
858cdf0e10cSrcweir         }
859cdf0e10cSrcweir 
PanelDescriptorsfx2::PanelDescriptor860cdf0e10cSrcweir         PanelDescriptor( const ::svt::PToolPanel& i_rPanel )
861cdf0e10cSrcweir             :pPanel( i_rPanel )
862cdf0e10cSrcweir             ,bHidden( false )
863cdf0e10cSrcweir         {
864cdf0e10cSrcweir         }
865cdf0e10cSrcweir     };
866cdf0e10cSrcweir 
867cdf0e10cSrcweir 	//==================================================================================================================
868cdf0e10cSrcweir 	//= TaskPaneController_Impl
869cdf0e10cSrcweir 	//==================================================================================================================
870cdf0e10cSrcweir     class TaskPaneController_Impl   :public ::boost::noncopyable
871cdf0e10cSrcweir                                     ,public ::svt::IToolPanelDeckListener
872cdf0e10cSrcweir     {
873cdf0e10cSrcweir     public:
874cdf0e10cSrcweir         TaskPaneController_Impl(
875cdf0e10cSrcweir             ModuleTaskPane& i_rTaskPane,
876cdf0e10cSrcweir             TitledDockingWindow& i_rDockingWindow
877cdf0e10cSrcweir         );
878cdf0e10cSrcweir         ~TaskPaneController_Impl();
879cdf0e10cSrcweir 
880cdf0e10cSrcweir         void    SetDefaultTitle( const String& i_rTitle );
881cdf0e10cSrcweir         void    ActivateToolPanel( const ::rtl::OUString& i_rPanelURL );
882cdf0e10cSrcweir 
883cdf0e10cSrcweir     protected:
884cdf0e10cSrcweir         // IToolPanelDeckListener overridables
885cdf0e10cSrcweir         virtual void PanelInserted( const ::svt::PToolPanel& i_pPanel, const size_t i_nPosition );
886cdf0e10cSrcweir         virtual void PanelRemoved( const size_t i_nPosition );
887cdf0e10cSrcweir         virtual void ActivePanelChanged( const ::boost::optional< size_t >& i_rOldActive, const ::boost::optional< size_t >& i_rNewActive );
888cdf0e10cSrcweir         virtual void LayouterChanged( const ::svt::PDeckLayouter& i_rNewLayouter );
889cdf0e10cSrcweir         virtual void Dying();
890cdf0e10cSrcweir 
891cdf0e10cSrcweir     private:
892cdf0e10cSrcweir         DECL_LINK( OnToolboxClicked, ToolBox* );
893cdf0e10cSrcweir         DECL_LINK( OnMenuItemSelected, Menu* );
894cdf0e10cSrcweir         DECL_LINK( DockingChanged, TitledDockingWindow* );
895cdf0e10cSrcweir         ::std::auto_ptr< PopupMenu > impl_createPopupMenu() const;
896cdf0e10cSrcweir 
897cdf0e10cSrcweir         /// sets the given layout for the panel selector
898cdf0e10cSrcweir         void    impl_setLayout( const PanelSelectorLayout i_eLayout, const bool i_bForce = false );
899cdf0e10cSrcweir 
900cdf0e10cSrcweir         /// returns the current layout of the panel selector
901cdf0e10cSrcweir         PanelSelectorLayout
impl_getLayout() const902cdf0e10cSrcweir                 impl_getLayout() const { return m_eCurrentLayout; }
903cdf0e10cSrcweir 
904cdf0e10cSrcweir         void    impl_updateDockingWindowTitle();
905cdf0e10cSrcweir         void    impl_togglePanelVisibility( const size_t i_nLogicalPanelIndex );
906cdf0e10cSrcweir         size_t  impl_getLogicalPanelIndex( const size_t i_nVisibleIndex );
907cdf0e10cSrcweir 
908cdf0e10cSrcweir     private:
909cdf0e10cSrcweir         enum MenuId
910cdf0e10cSrcweir         {
911cdf0e10cSrcweir             MID_UNLOCK_TASK_PANEL = 1,
912cdf0e10cSrcweir             MID_LOCK_TASK_PANEL = 2,
913cdf0e10cSrcweir             MID_LAYOUT_TABS = 3,
914cdf0e10cSrcweir             MID_LAYOUT_DRAWERS = 4,
915cdf0e10cSrcweir             MID_FIRST_PANEL = 5
916cdf0e10cSrcweir         };
917cdf0e10cSrcweir 
918cdf0e10cSrcweir     private:
919cdf0e10cSrcweir         typedef ::std::vector< PanelDescriptor >    PanelDescriptors;
920cdf0e10cSrcweir 
921cdf0e10cSrcweir         ModuleTaskPane&         m_rTaskPane;
922cdf0e10cSrcweir         TitledDockingWindow&    m_rDockingWindow;
923cdf0e10cSrcweir         sal_uInt16                  m_nViewMenuID;
924cdf0e10cSrcweir         PanelSelectorLayout     m_eCurrentLayout;
925cdf0e10cSrcweir         PanelDescriptors        m_aPanelRepository;
926cdf0e10cSrcweir         bool                    m_bTogglingPanelVisibility;
927cdf0e10cSrcweir         ::rtl::OUString         m_sDefaultTitle;
928cdf0e10cSrcweir     };
929cdf0e10cSrcweir 
930cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
TaskPaneController_Impl(ModuleTaskPane & i_rTaskPane,TitledDockingWindow & i_rDockingWindow)931cdf0e10cSrcweir     TaskPaneController_Impl::TaskPaneController_Impl( ModuleTaskPane& i_rTaskPane, TitledDockingWindow& i_rDockingWindow )
932cdf0e10cSrcweir         :m_rTaskPane( i_rTaskPane )
933cdf0e10cSrcweir         ,m_rDockingWindow( i_rDockingWindow )
934cdf0e10cSrcweir         ,m_nViewMenuID( 0 )
935cdf0e10cSrcweir         ,m_eCurrentLayout( LAYOUT_DRAWERS )
936cdf0e10cSrcweir         ,m_aPanelRepository()
937cdf0e10cSrcweir         ,m_bTogglingPanelVisibility( false )
938cdf0e10cSrcweir         ,m_sDefaultTitle()
939cdf0e10cSrcweir     {
940cdf0e10cSrcweir         m_rDockingWindow.ResetToolBox();
941cdf0e10cSrcweir         m_nViewMenuID = m_rDockingWindow.AddDropDownToolBoxItem(
942cdf0e10cSrcweir             String( SfxResId( STR_SFX_TASK_PANE_VIEW ) ),
943cdf0e10cSrcweir 			HID_TASKPANE_VIEW_MENU,
944cdf0e10cSrcweir             LINK( this, TaskPaneController_Impl, OnToolboxClicked )
945cdf0e10cSrcweir         );
946cdf0e10cSrcweir         m_rDockingWindow.SetEndDockingHdl( LINK( this, TaskPaneController_Impl, DockingChanged ) );
947*5e8455cfSAndre Fischer         impl_setLayout(LAYOUT_TABS_RIGHT, true);
948cdf0e10cSrcweir 
949cdf0e10cSrcweir         m_rTaskPane.GetPanelDeck().AddListener( *this );
950cdf0e10cSrcweir 
951cdf0e10cSrcweir         // initialize the panel repository
952cdf0e10cSrcweir         for ( size_t i = 0; i < m_rTaskPane.GetPanelDeck().GetPanelCount(); ++i )
953cdf0e10cSrcweir         {
954cdf0e10cSrcweir             ::svt::PToolPanel pPanel( m_rTaskPane.GetPanelDeck().GetPanel( i ) );
955cdf0e10cSrcweir             m_aPanelRepository.push_back( PanelDescriptor( pPanel ) );
956cdf0e10cSrcweir         }
957cdf0e10cSrcweir 
958cdf0e10cSrcweir         SetDefaultTitle( String( SfxResId( STR_SFX_TASKS ) ) );
959cdf0e10cSrcweir     }
960cdf0e10cSrcweir 
961cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
~TaskPaneController_Impl()962cdf0e10cSrcweir     TaskPaneController_Impl::~TaskPaneController_Impl()
963cdf0e10cSrcweir     {
964cdf0e10cSrcweir         m_rTaskPane.GetPanelDeck().RemoveListener( *this );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir         // remove the panels which are not under the control of the panel deck currently
967cdf0e10cSrcweir         for (   PanelDescriptors::iterator panelPos = m_aPanelRepository.begin();
968cdf0e10cSrcweir                 panelPos != m_aPanelRepository.end();
969cdf0e10cSrcweir                 ++panelPos
970cdf0e10cSrcweir             )
971cdf0e10cSrcweir         {
972cdf0e10cSrcweir             if ( panelPos->bHidden )
973cdf0e10cSrcweir                 panelPos->pPanel->Dispose();
974cdf0e10cSrcweir         }
975cdf0e10cSrcweir         m_aPanelRepository.clear();
976cdf0e10cSrcweir     }
977cdf0e10cSrcweir 
978cdf0e10cSrcweir     // -----------------------------------------------------------------------------------------------------------------
SetDefaultTitle(const String & i_rTitle)979cdf0e10cSrcweir     void TaskPaneController_Impl::SetDefaultTitle( const String& i_rTitle )
980cdf0e10cSrcweir     {
981cdf0e10cSrcweir         m_sDefaultTitle = i_rTitle;
982cdf0e10cSrcweir         impl_updateDockingWindowTitle();
983cdf0e10cSrcweir     }
984cdf0e10cSrcweir 
985cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ActivateToolPanel(const::rtl::OUString & i_rPanelURL)986cdf0e10cSrcweir     void TaskPaneController_Impl::ActivateToolPanel( const ::rtl::OUString& i_rPanelURL )
987cdf0e10cSrcweir     {
988cdf0e10cSrcweir         ::boost::optional< size_t > aPanelPos( m_rTaskPane.GetPanelPos( i_rPanelURL ) );
989cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( !!aPanelPos, "TaskPaneController_Impl::ActivateToolPanel: no such panel!" );
990cdf0e10cSrcweir 
991cdf0e10cSrcweir         if ( aPanelPos == m_rTaskPane.GetPanelDeck().GetActivePanel() )
992cdf0e10cSrcweir         {
993cdf0e10cSrcweir             ::svt::PToolPanel pPanel( m_rTaskPane.GetPanelDeck().GetPanel( *aPanelPos ) );
994cdf0e10cSrcweir             pPanel->GrabFocus();
995cdf0e10cSrcweir         }
996cdf0e10cSrcweir         else
997cdf0e10cSrcweir         {
998cdf0e10cSrcweir             m_rTaskPane.GetPanelDeck().ActivatePanel( aPanelPos );
999cdf0e10cSrcweir         }
1000cdf0e10cSrcweir     }
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir     // -----------------------------------------------------------------------------------------------------------------
IMPL_LINK(TaskPaneController_Impl,DockingChanged,TitledDockingWindow *,i_pDockingWindow)1003cdf0e10cSrcweir     IMPL_LINK( TaskPaneController_Impl, DockingChanged, TitledDockingWindow*, i_pDockingWindow )
1004cdf0e10cSrcweir     {
1005cdf0e10cSrcweir         ENSURE_OR_RETURN( i_pDockingWindow && &m_rDockingWindow, "TaskPaneController_Impl::DockingChanged: where does this come from?", 0L );
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir         if ( impl_getLayout() == LAYOUT_DRAWERS )
1008cdf0e10cSrcweir             return 0L;
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir         impl_setLayout( lcl_getTabLayoutFromAlignment( i_pDockingWindow->GetAlignment() ) );
1011cdf0e10cSrcweir         return 1L;
1012cdf0e10cSrcweir     }
1013cdf0e10cSrcweir 
1014cdf0e10cSrcweir     // -----------------------------------------------------------------------------------------------------------------
IMPL_LINK(TaskPaneController_Impl,OnToolboxClicked,ToolBox *,i_pToolBox)1015cdf0e10cSrcweir     IMPL_LINK( TaskPaneController_Impl, OnToolboxClicked, ToolBox*, i_pToolBox )
1016cdf0e10cSrcweir     {
1017cdf0e10cSrcweir 	    if ( i_pToolBox->GetCurItemId() == m_nViewMenuID )
1018cdf0e10cSrcweir         {
1019cdf0e10cSrcweir             i_pToolBox->EndSelection();
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir             ::std::auto_ptr< PopupMenu > pMenu = impl_createPopupMenu();
1022cdf0e10cSrcweir             pMenu->SetSelectHdl( LINK( this, TaskPaneController_Impl, OnMenuItemSelected ) );
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir             // pass toolbox button rect so the menu can stay open on button up
1025cdf0e10cSrcweir             Rectangle aMenuRect( i_pToolBox->GetItemRect( m_nViewMenuID ) );
1026cdf0e10cSrcweir             aMenuRect.SetPos( i_pToolBox->GetPosPixel() );
1027cdf0e10cSrcweir             pMenu->Execute( &m_rDockingWindow, aMenuRect, POPUPMENU_EXECUTE_DOWN );
1028cdf0e10cSrcweir         }
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir 	    return 0;
1031cdf0e10cSrcweir     }
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
IMPL_LINK(TaskPaneController_Impl,OnMenuItemSelected,Menu *,i_pMenu)1034cdf0e10cSrcweir     IMPL_LINK( TaskPaneController_Impl, OnMenuItemSelected, Menu*, i_pMenu )
1035cdf0e10cSrcweir     {
1036cdf0e10cSrcweir         ENSURE_OR_RETURN( i_pMenu, "TaskPaneController_Impl::OnMenuItemSelected: illegal menu!", 0L );
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir         i_pMenu->Deactivate();
1039cdf0e10cSrcweir         switch ( i_pMenu->GetCurItemId() )
1040cdf0e10cSrcweir         {
1041cdf0e10cSrcweir             case MID_UNLOCK_TASK_PANEL:
1042cdf0e10cSrcweir                 m_rDockingWindow.SetFloatingMode( sal_True );
1043cdf0e10cSrcweir                 break;
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir             case MID_LOCK_TASK_PANEL:
1046cdf0e10cSrcweir                 m_rDockingWindow.SetFloatingMode( sal_False );
1047cdf0e10cSrcweir                 break;
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir             case MID_LAYOUT_DRAWERS:
1050cdf0e10cSrcweir                 impl_setLayout( LAYOUT_DRAWERS );
1051cdf0e10cSrcweir                 break;
1052cdf0e10cSrcweir 
1053cdf0e10cSrcweir             case MID_LAYOUT_TABS:
1054cdf0e10cSrcweir                 impl_setLayout( lcl_getTabLayoutFromAlignment( m_rDockingWindow.GetAlignment() ) );
1055cdf0e10cSrcweir                 break;
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir             default:
1058cdf0e10cSrcweir             {
1059cdf0e10cSrcweir                 size_t nPanelIndex = size_t( i_pMenu->GetCurItemId() - MID_FIRST_PANEL );
1060cdf0e10cSrcweir                 impl_togglePanelVisibility( nPanelIndex );
1061cdf0e10cSrcweir             }
1062cdf0e10cSrcweir             break;
1063cdf0e10cSrcweir         }
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir         return 1L;
1066cdf0e10cSrcweir     }
1067cdf0e10cSrcweir 
1068cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
impl_getLogicalPanelIndex(const size_t i_nVisibleIndex)1069cdf0e10cSrcweir     size_t TaskPaneController_Impl::impl_getLogicalPanelIndex( const size_t i_nVisibleIndex )
1070cdf0e10cSrcweir     {
1071cdf0e10cSrcweir         size_t nLogicalIndex = 0;
1072cdf0e10cSrcweir         size_t nVisibleIndex( i_nVisibleIndex );
1073cdf0e10cSrcweir         for ( size_t i=0; i < m_aPanelRepository.size(); ++i )
1074cdf0e10cSrcweir         {
1075cdf0e10cSrcweir             if ( !m_aPanelRepository[i].bHidden )
1076cdf0e10cSrcweir             {
1077cdf0e10cSrcweir                 if ( !nVisibleIndex )
1078cdf0e10cSrcweir                     break;
1079cdf0e10cSrcweir                 --nVisibleIndex;
1080cdf0e10cSrcweir             }
1081cdf0e10cSrcweir             ++nLogicalIndex;
1082cdf0e10cSrcweir         }
1083cdf0e10cSrcweir         return nLogicalIndex;
1084cdf0e10cSrcweir     }
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
PanelInserted(const::svt::PToolPanel & i_pPanel,const size_t i_nPosition)1087cdf0e10cSrcweir     void TaskPaneController_Impl::PanelInserted( const ::svt::PToolPanel& i_pPanel, const size_t i_nPosition )
1088cdf0e10cSrcweir     {
1089cdf0e10cSrcweir         if ( m_bTogglingPanelVisibility )
1090cdf0e10cSrcweir             return;
1091cdf0e10cSrcweir 
1092cdf0e10cSrcweir         const size_t nLogicalIndex( impl_getLogicalPanelIndex( i_nPosition ) );
1093cdf0e10cSrcweir         m_aPanelRepository.insert( m_aPanelRepository.begin() + nLogicalIndex, PanelDescriptor( i_pPanel ) );
1094cdf0e10cSrcweir     }
1095cdf0e10cSrcweir 
1096cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
PanelRemoved(const size_t i_nPosition)1097cdf0e10cSrcweir     void TaskPaneController_Impl::PanelRemoved( const size_t i_nPosition )
1098cdf0e10cSrcweir     {
1099cdf0e10cSrcweir         if ( m_bTogglingPanelVisibility )
1100cdf0e10cSrcweir             return;
1101cdf0e10cSrcweir 
1102cdf0e10cSrcweir         const size_t nLogicalIndex( impl_getLogicalPanelIndex( i_nPosition ) );
1103cdf0e10cSrcweir         m_aPanelRepository.erase( m_aPanelRepository.begin() + nLogicalIndex );
1104cdf0e10cSrcweir     }
1105cdf0e10cSrcweir 
1106cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
ActivePanelChanged(const::boost::optional<size_t> & i_rOldActive,const::boost::optional<size_t> & i_rNewActive)1107cdf0e10cSrcweir     void TaskPaneController_Impl::ActivePanelChanged( const ::boost::optional< size_t >& i_rOldActive, const ::boost::optional< size_t >& i_rNewActive )
1108cdf0e10cSrcweir     {
1109cdf0e10cSrcweir         if ( impl_getLayout() == LAYOUT_DRAWERS )
1110cdf0e10cSrcweir             // no adjustment of the title when we use the classical "drawers" layout
1111cdf0e10cSrcweir             return;
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir         impl_updateDockingWindowTitle( );
1114cdf0e10cSrcweir         (void)i_rOldActive;
1115cdf0e10cSrcweir         (void)i_rNewActive;
1116cdf0e10cSrcweir     }
1117cdf0e10cSrcweir 
1118cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
LayouterChanged(const::svt::PDeckLayouter & i_rNewLayouter)1119cdf0e10cSrcweir     void TaskPaneController_Impl::LayouterChanged( const ::svt::PDeckLayouter& i_rNewLayouter )
1120cdf0e10cSrcweir     {
1121cdf0e10cSrcweir         // not interested in
1122cdf0e10cSrcweir         (void)i_rNewLayouter;
1123cdf0e10cSrcweir     }
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
Dying()1126cdf0e10cSrcweir     void TaskPaneController_Impl::Dying()
1127cdf0e10cSrcweir     {
1128cdf0e10cSrcweir         OSL_ENSURE( false, "TaskPaneController_Impl::Dying: unexpected call!" );
1129cdf0e10cSrcweir         // We are expected to live longer than the ToolPanelDeck we work with. Since we remove ourself, in our dtor,
1130cdf0e10cSrcweir         // as listener from the panel deck, this method here should never be called.
1131cdf0e10cSrcweir     }
1132cdf0e10cSrcweir 
1133cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
impl_togglePanelVisibility(const size_t i_nLogicalPanelIndex)1134cdf0e10cSrcweir     void TaskPaneController_Impl::impl_togglePanelVisibility( const size_t i_nLogicalPanelIndex )
1135cdf0e10cSrcweir     {
1136cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( i_nLogicalPanelIndex < m_aPanelRepository.size(), "illegal index" );
1137cdf0e10cSrcweir 
1138cdf0e10cSrcweir         // get the actual panel index, within the deck
1139cdf0e10cSrcweir         size_t nActualPanelIndex(0);
1140cdf0e10cSrcweir         for ( size_t i=0; i < i_nLogicalPanelIndex; ++i )
1141cdf0e10cSrcweir         {
1142cdf0e10cSrcweir             if ( !m_aPanelRepository[i].bHidden )
1143cdf0e10cSrcweir                 ++nActualPanelIndex;
1144cdf0e10cSrcweir         }
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir         ::boost::optional< size_t > aActivatePanel;
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir         m_bTogglingPanelVisibility = true;
1149cdf0e10cSrcweir         if ( m_aPanelRepository[ i_nLogicalPanelIndex ].bHidden )
1150cdf0e10cSrcweir         {
1151cdf0e10cSrcweir             OSL_VERIFY( m_rTaskPane.GetPanelDeck().InsertPanel( m_aPanelRepository[ i_nLogicalPanelIndex ].pPanel, nActualPanelIndex ) == nActualPanelIndex );
1152cdf0e10cSrcweir             // if there has not been an active panel before, activate the newly inserted one
1153cdf0e10cSrcweir             ::boost::optional< size_t > aActivePanel( m_rTaskPane.GetPanelDeck().GetActivePanel() );
1154cdf0e10cSrcweir             if ( !aActivePanel )
1155cdf0e10cSrcweir                 aActivatePanel = nActualPanelIndex;
1156cdf0e10cSrcweir         }
1157cdf0e10cSrcweir         else
1158cdf0e10cSrcweir         {
1159cdf0e10cSrcweir             OSL_VERIFY( m_rTaskPane.GetPanelDeck().RemovePanel( nActualPanelIndex ).get() == m_aPanelRepository[ i_nLogicalPanelIndex ].pPanel.get() );
1160cdf0e10cSrcweir         }
1161cdf0e10cSrcweir         m_bTogglingPanelVisibility = false;
1162cdf0e10cSrcweir         m_aPanelRepository[ i_nLogicalPanelIndex ].bHidden = !m_aPanelRepository[ i_nLogicalPanelIndex ].bHidden;
1163cdf0e10cSrcweir 
1164cdf0e10cSrcweir         if ( !!aActivatePanel )
1165cdf0e10cSrcweir             m_rTaskPane.GetPanelDeck().ActivatePanel( *aActivatePanel );
1166cdf0e10cSrcweir     }
1167cdf0e10cSrcweir 
1168cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
impl_setLayout(const PanelSelectorLayout i_eLayout,const bool i_bForce)1169cdf0e10cSrcweir     void TaskPaneController_Impl::impl_setLayout( const PanelSelectorLayout i_eLayout, const bool i_bForce )
1170cdf0e10cSrcweir     {
1171cdf0e10cSrcweir         if ( !i_bForce && ( m_eCurrentLayout == i_eLayout ) )
1172cdf0e10cSrcweir             return;
1173cdf0e10cSrcweir 
1174cdf0e10cSrcweir         switch ( i_eLayout )
1175cdf0e10cSrcweir         {
1176cdf0e10cSrcweir         case LAYOUT_DRAWERS:
1177cdf0e10cSrcweir             m_rTaskPane.SetDrawersLayout();
1178cdf0e10cSrcweir             break;
1179cdf0e10cSrcweir         case LAYOUT_TABS_TOP:
1180cdf0e10cSrcweir             m_rTaskPane.SetTabsLayout( ::svt::TABS_TOP, ::svt::TABITEM_IMAGE_ONLY );
1181cdf0e10cSrcweir             break;
1182cdf0e10cSrcweir         case LAYOUT_TABS_BOTTOM:
1183cdf0e10cSrcweir             m_rTaskPane.SetTabsLayout( ::svt::TABS_BOTTOM, ::svt::TABITEM_IMAGE_ONLY );
1184cdf0e10cSrcweir             break;
1185cdf0e10cSrcweir         case LAYOUT_TABS_LEFT:
1186cdf0e10cSrcweir             m_rTaskPane.SetTabsLayout( ::svt::TABS_LEFT, ::svt::TABITEM_IMAGE_ONLY );
1187cdf0e10cSrcweir             break;
1188cdf0e10cSrcweir         case LAYOUT_TABS_RIGHT:
1189cdf0e10cSrcweir             m_rTaskPane.SetTabsLayout( ::svt::TABS_RIGHT, ::svt::TABITEM_IMAGE_ONLY );
1190cdf0e10cSrcweir             break;
1191cdf0e10cSrcweir         }
1192cdf0e10cSrcweir         m_eCurrentLayout = i_eLayout;
1193cdf0e10cSrcweir 
1194cdf0e10cSrcweir         impl_updateDockingWindowTitle();
1195cdf0e10cSrcweir     }
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
impl_updateDockingWindowTitle()1198cdf0e10cSrcweir     void TaskPaneController_Impl::impl_updateDockingWindowTitle()
1199cdf0e10cSrcweir     {
1200cdf0e10cSrcweir         ::boost::optional< size_t > aActivePanel( m_rTaskPane.GetPanelDeck().GetActivePanel() );
1201cdf0e10cSrcweir         if ( !aActivePanel || ( impl_getLayout() == LAYOUT_DRAWERS ) )
1202cdf0e10cSrcweir             m_rDockingWindow.SetTitle( m_sDefaultTitle );
1203cdf0e10cSrcweir         else
1204cdf0e10cSrcweir         {
1205cdf0e10cSrcweir             size_t nNewActive( *aActivePanel );
1206cdf0e10cSrcweir             for ( size_t i=0; i < m_aPanelRepository.size(); ++i )
1207cdf0e10cSrcweir             {
1208cdf0e10cSrcweir                 if ( m_aPanelRepository[i].bHidden )
1209cdf0e10cSrcweir                     continue;
1210cdf0e10cSrcweir 
1211cdf0e10cSrcweir                 if ( !nNewActive )
1212cdf0e10cSrcweir                 {
1213cdf0e10cSrcweir                     m_rDockingWindow.SetTitle( m_aPanelRepository[i].pPanel->GetDisplayName() );
1214cdf0e10cSrcweir                     break;
1215cdf0e10cSrcweir                 }
1216cdf0e10cSrcweir                 --nNewActive;
1217cdf0e10cSrcweir             }
1218cdf0e10cSrcweir         }
1219cdf0e10cSrcweir     }
1220cdf0e10cSrcweir 
1221cdf0e10cSrcweir     // ---------------------------------------------------------------------------------------------------------------------
impl_createPopupMenu() const1222cdf0e10cSrcweir     ::std::auto_ptr< PopupMenu > TaskPaneController_Impl::impl_createPopupMenu() const
1223cdf0e10cSrcweir     {
1224cdf0e10cSrcweir         ::std::auto_ptr<PopupMenu> pMenu( new PopupMenu );
1225cdf0e10cSrcweir         FloatingWindow* pMenuWindow = static_cast< FloatingWindow* >( pMenu->GetWindow() );
1226cdf0e10cSrcweir         if ( pMenuWindow != NULL )
1227cdf0e10cSrcweir         {
1228cdf0e10cSrcweir             pMenuWindow->SetPopupModeFlags ( pMenuWindow->GetPopupModeFlags() | FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE );
1229cdf0e10cSrcweir         }
1230cdf0e10cSrcweir 
1231cdf0e10cSrcweir         // Add one entry for every tool panel element to individually make
1232cdf0e10cSrcweir         // them visible or hide them.
1233cdf0e10cSrcweir         sal_uInt16 nIndex = MID_FIRST_PANEL;
1234cdf0e10cSrcweir         for ( size_t i=0; i<m_aPanelRepository.size(); ++i, ++nIndex )
1235cdf0e10cSrcweir         {
1236cdf0e10cSrcweir             const PanelDescriptor& rPanelDesc( m_aPanelRepository[i] );
1237cdf0e10cSrcweir             pMenu->InsertItem( nIndex, rPanelDesc.pPanel->GetDisplayName(), MIB_CHECKABLE );
1238cdf0e10cSrcweir             pMenu->CheckItem( nIndex, !rPanelDesc.bHidden );
1239cdf0e10cSrcweir         }
1240cdf0e10cSrcweir         pMenu->InsertSeparator();
1241cdf0e10cSrcweir 
1242cdf0e10cSrcweir     #if OSL_DEBUG_LEVEL > 0
1243cdf0e10cSrcweir         pMenu->InsertItem( MID_LAYOUT_TABS, String::CreateFromAscii( "Tab-Layout (exp.)" ), MIB_CHECKABLE );
1244cdf0e10cSrcweir         pMenu->CheckItem( MID_LAYOUT_TABS, impl_getLayout() != LAYOUT_DRAWERS );
1245cdf0e10cSrcweir         pMenu->InsertItem( MID_LAYOUT_DRAWERS, String::CreateFromAscii( "Drawer-Layout" ), MIB_CHECKABLE );
1246cdf0e10cSrcweir         pMenu->CheckItem( MID_LAYOUT_DRAWERS, impl_getLayout() == LAYOUT_DRAWERS );
1247cdf0e10cSrcweir 
1248cdf0e10cSrcweir         pMenu->InsertSeparator();
1249cdf0e10cSrcweir     #endif
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir         // Add entry for docking or un-docking the tool panel.
1252cdf0e10cSrcweir         if ( m_rDockingWindow.IsFloatingMode() )
1253cdf0e10cSrcweir             pMenu->InsertItem(
1254cdf0e10cSrcweir                 MID_LOCK_TASK_PANEL,
1255cdf0e10cSrcweir                 String( SfxResId( STR_SFX_DOCK ) )
1256cdf0e10cSrcweir             );
1257cdf0e10cSrcweir         else
1258cdf0e10cSrcweir             pMenu->InsertItem(
1259cdf0e10cSrcweir                 MID_UNLOCK_TASK_PANEL,
1260cdf0e10cSrcweir                 String( SfxResId( STR_SFX_UNDOCK ) )
1261cdf0e10cSrcweir             );
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir         pMenu->RemoveDisabledEntries( sal_False, sal_False );
1264cdf0e10cSrcweir 
1265cdf0e10cSrcweir         return pMenu;
1266cdf0e10cSrcweir     }
1267cdf0e10cSrcweir 
1268cdf0e10cSrcweir 	//==================================================================================================================
1269cdf0e10cSrcweir 	//= TaskPaneController
1270cdf0e10cSrcweir 	//==================================================================================================================
1271cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
TaskPaneController(ModuleTaskPane & i_rTaskPane,TitledDockingWindow & i_rDockingWindow)1272cdf0e10cSrcweir     TaskPaneController::TaskPaneController( ModuleTaskPane& i_rTaskPane, TitledDockingWindow& i_rDockingWindow )
1273cdf0e10cSrcweir         :m_pImpl( new TaskPaneController_Impl( i_rTaskPane, i_rDockingWindow ) )
1274cdf0e10cSrcweir     {
1275cdf0e10cSrcweir     }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
~TaskPaneController()1278cdf0e10cSrcweir     TaskPaneController::~TaskPaneController()
1279cdf0e10cSrcweir     {
1280cdf0e10cSrcweir     }
1281cdf0e10cSrcweir 
1282cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
SetDefaultTitle(const String & i_rTitle)1283cdf0e10cSrcweir     void TaskPaneController::SetDefaultTitle( const String& i_rTitle )
1284cdf0e10cSrcweir     {
1285cdf0e10cSrcweir         m_pImpl->SetDefaultTitle( i_rTitle );
1286cdf0e10cSrcweir     }
1287cdf0e10cSrcweir 
1288cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ActivateToolPanel(const::rtl::OUString & i_rPanelURL)1289cdf0e10cSrcweir     void TaskPaneController::ActivateToolPanel( const ::rtl::OUString& i_rPanelURL )
1290cdf0e10cSrcweir     {
1291cdf0e10cSrcweir         m_pImpl->ActivateToolPanel( i_rPanelURL );
1292cdf0e10cSrcweir     }
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir //......................................................................................................................
1295cdf0e10cSrcweir } // namespace sfx2
1296cdf0e10cSrcweir //......................................................................................................................
1297