1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sd.hxx" 30 #include "PaneChildWindows.hxx" 31 #include "PaneDockingWindow.hrc" 32 #include "PaneDockingWindow.hxx" 33 #include "ViewShellBase.hxx" 34 #include "framework/FrameworkHelper.hxx" 35 #include "taskpane/ToolPanelViewShell.hxx" 36 #include "app.hrc" 37 #include "strings.hrc" 38 #include "sdresid.hxx" 39 40 #include <com/sun/star/drawing/framework/XConfigurationController.hpp> 41 #include <com/sun/star/drawing/framework/ResourceActivationMode.hpp> 42 43 #include <sfx2/app.hxx> 44 #include <sfx2/dockwin.hxx> 45 #include <sfx2/bindings.hxx> 46 #include <sfx2/dispatch.hxx> 47 #include <tools/diagnose_ex.h> 48 49 namespace sd { 50 51 using ::com::sun::star::uno::Reference; 52 using ::com::sun::star::drawing::framework::XResourceId; 53 using ::com::sun::star::drawing::framework::XConfigurationController; 54 using ::com::sun::star::drawing::framework::ResourceActivationMode_ADD; 55 using ::com::sun::star::drawing::framework::ResourceActivationMode_REPLACE; 56 57 SFX_IMPL_DOCKINGWINDOW(LeftPaneImpressChildWindow, SID_LEFT_PANE_IMPRESS) 58 SFX_IMPL_DOCKINGWINDOW(LeftPaneDrawChildWindow, SID_LEFT_PANE_DRAW) 59 SFX_IMPL_DOCKINGWINDOW( ToolPanelChildWindow, SID_TASKPANE) 60 61 //===== PaneChildWindow ======================================================= 62 63 PaneChildWindow::PaneChildWindow ( 64 ::Window* pParentWindow, 65 sal_uInt16 nId, 66 SfxBindings* pBindings, 67 SfxChildWinInfo* pInfo, 68 const sal_uInt16 nDockWinTitleResId, 69 const sal_uInt16 nTitleBarResId, 70 SfxChildAlignment eAlignment) 71 : SfxChildWindow (pParentWindow, nId) 72 { 73 pWindow = new PaneDockingWindow ( 74 pBindings, 75 this, 76 pParentWindow, 77 SdResId( nDockWinTitleResId ), 78 String( SdResId( nTitleBarResId ) ) ); 79 eChildAlignment = eAlignment; 80 static_cast<SfxDockingWindow*>(pWindow)->Initialize(pInfo); 81 SetHideNotDelete(sal_True); 82 83 ViewShellBase* pBase = ViewShellBase::GetViewShellBase(pBindings->GetDispatcher()->GetFrame()); 84 if (pBase != NULL) 85 { 86 framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration(); 87 } 88 } 89 90 91 92 93 PaneChildWindow::~PaneChildWindow (void) 94 { 95 ViewShellBase* pBase = NULL; 96 PaneDockingWindow* pDockingWindow = dynamic_cast<PaneDockingWindow*>(pWindow); 97 if (pDockingWindow != NULL) 98 pBase = ViewShellBase::GetViewShellBase( 99 pDockingWindow->GetBindings().GetDispatcher()->GetFrame()); 100 if (pBase != NULL) 101 framework::FrameworkHelper::Instance(*pBase)->UpdateConfiguration(); 102 } 103 104 105 106 107 108 109 //===== LeftPaneImpressChildWindow ============================================ 110 111 LeftPaneImpressChildWindow::LeftPaneImpressChildWindow ( 112 ::Window* pParentWindow, 113 sal_uInt16 nId, 114 SfxBindings* pBindings, 115 SfxChildWinInfo* pInfo) 116 : PaneChildWindow( 117 pParentWindow, 118 nId, 119 pBindings, 120 pInfo, 121 FLT_LEFT_PANE_IMPRESS_DOCKING_WINDOW, 122 STR_LEFT_PANE_IMPRESS_TITLE, 123 SFX_ALIGN_LEFT) 124 { 125 } 126 127 128 129 130 //===== LeftPaneDrawChildWindow =============================================== 131 132 LeftPaneDrawChildWindow::LeftPaneDrawChildWindow ( 133 ::Window* pParentWindow, 134 sal_uInt16 nId, 135 SfxBindings* pBindings, 136 SfxChildWinInfo* pInfo) 137 : PaneChildWindow( 138 pParentWindow, 139 nId, 140 pBindings, 141 pInfo, 142 FLT_LEFT_PANE_DRAW_DOCKING_WINDOW, 143 STR_LEFT_PANE_DRAW_TITLE, 144 SFX_ALIGN_LEFT) 145 { 146 } 147 148 149 150 151 //====================================================================================================================== 152 //= ToolPanelChildWindow 153 //====================================================================================================================== 154 //---------------------------------------------------------------------------------------------------------------------- 155 ToolPanelChildWindow::ToolPanelChildWindow( ::Window* i_pParentWindow, sal_uInt16 i_nId, SfxBindings* i_pBindings, 156 SfxChildWinInfo* i_pChildWindowInfo ) 157 :PaneChildWindow( i_pParentWindow, i_nId, i_pBindings, i_pChildWindowInfo, 158 FLT_TOOL_PANEL_DOCKING_WINDOW, STR_RIGHT_PANE_TITLE, SFX_ALIGN_RIGHT ) 159 { 160 // just in case this window has been created by SFX, instead our resource framework: Ensure that the resource framework 161 // activates the task pane, so it is really filled with content (in opposite to the other SFX applications, the 162 // child window registered for SID_TASKPANE is not responsible for its content, but here in SD, it's the ToolPanelViewShell 163 // which has this responsibility. And this view shell is created implicitly via the resource framework.) 164 // #i113788# / 2010-09-03 / frank.schoenheit@oracle.com 165 SfxDockingWindow* pDockingWindow = dynamic_cast< SfxDockingWindow* >( GetWindow() ); 166 ViewShellBase* pViewShellBase = ViewShellBase::GetViewShellBase( pDockingWindow->GetBindings().GetDispatcher()->GetFrame() ); 167 ENSURE_OR_RETURN_VOID( pViewShellBase != NULL, "ToolPanelChildWindow::ToolPanelChildWindow: no view shell access!" ); 168 169 const ::boost::shared_ptr< framework::FrameworkHelper > pFrameworkHelper( framework::FrameworkHelper::Instance( *pViewShellBase ) ); 170 ENSURE_OR_RETURN_VOID( pFrameworkHelper.get(), "ToolPanelChildWindow::ToolPanelChildWindow: no framework helper for the view shell!" ); 171 Reference<XConfigurationController> xConfigController( pFrameworkHelper->GetConfigurationController() ); 172 ENSURE_OR_RETURN_VOID( xConfigController.is(), "ToolPanelChildWindow::ToolPanelChildWindow: no config controller!" ); 173 xConfigController->requestResourceActivation( 174 framework::FrameworkHelper::CreateResourceId( framework::FrameworkHelper::msRightPaneURL ), 175 ResourceActivationMode_ADD ); 176 xConfigController->requestResourceActivation( 177 framework::FrameworkHelper::CreateResourceId( framework::FrameworkHelper::msTaskPaneURL, framework::FrameworkHelper::msRightPaneURL ), 178 ResourceActivationMode_REPLACE 179 ); 180 } 181 182 //---------------------------------------------------------------------------------------------------------------------- 183 struct DelayedToolPanelActivation 184 { 185 DelayedToolPanelActivation( ToolPanelChildWindow& i_rToolPanelWindow, const ::rtl::OUString& i_rPanelURL ) 186 :m_rToolPanelWindow( i_rToolPanelWindow ) 187 ,m_sPanelURL( i_rPanelURL ) 188 { 189 } 190 191 void operator() (bool) 192 { 193 m_rToolPanelWindow.ActivateToolPanel( m_sPanelURL ); 194 } 195 196 private: 197 ToolPanelChildWindow& m_rToolPanelWindow; 198 const ::rtl::OUString m_sPanelURL; 199 }; 200 201 //---------------------------------------------------------------------------------------------------------------------- 202 void ToolPanelChildWindow::ActivateToolPanel( const ::rtl::OUString& i_rPanelURL ) 203 { 204 SfxDockingWindow* pDockingWindow = dynamic_cast< SfxDockingWindow* >( GetWindow() ); 205 ViewShellBase* pViewShellBase = ViewShellBase::GetViewShellBase( pDockingWindow->GetBindings().GetDispatcher()->GetFrame() ); 206 ENSURE_OR_RETURN_VOID( pViewShellBase != NULL, "ToolPanelChildWindow::ActivateToolPanel: no view shell access!" ); 207 208 const ::boost::shared_ptr< framework::FrameworkHelper > pFrameworkHelper( framework::FrameworkHelper::Instance( *pViewShellBase ) ); 209 210 if ( i_rPanelURL.indexOf( framework::FrameworkHelper::msTaskPanelURLPrefix ) == 0 ) 211 { 212 // it's one of our standard panels known to the drawing framework 213 pFrameworkHelper->RequestTaskPanel( i_rPanelURL ); 214 } 215 else 216 { 217 // TODO: it would be nice if the drawing framework were able to handle non-standard panels, installed by 218 // extensions, too. As long as this is not the case, we need to take the direct way ... 219 ::boost::shared_ptr< ViewShell > pViewShell = pFrameworkHelper->GetViewShell( framework::FrameworkHelper::msRightPaneURL ); 220 toolpanel::ToolPanelViewShell* pToolPanelViewShell = dynamic_cast< toolpanel::ToolPanelViewShell* >( pViewShell.get() ); 221 if ( pToolPanelViewShell ) 222 { 223 pToolPanelViewShell->ActivatePanel( i_rPanelURL ); 224 } 225 else 226 { 227 Reference< XResourceId > xTaskPaneResource = pFrameworkHelper->RequestView( 228 framework::FrameworkHelper::msTaskPaneURL, framework::FrameworkHelper::msRightPaneURL ); 229 pFrameworkHelper->RunOnResourceActivation( xTaskPaneResource, DelayedToolPanelActivation( *this, i_rPanelURL ) ); 230 } 231 } 232 } 233 234 } // end of namespace ::sd 235