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