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