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