15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55b190011SAndrew Rist  * distributed with this work for additional information
65b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist  * "License"); you may not use this file except in compliance
95b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
105b190011SAndrew Rist  *
115b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
125b190011SAndrew Rist  *
135b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist  * software distributed under the License is distributed on an
155b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
175b190011SAndrew Rist  * specific language governing permissions and limitations
185b190011SAndrew Rist  * under the License.
195b190011SAndrew Rist  *
205b190011SAndrew Rist  *************************************************************/
215b190011SAndrew Rist 
225b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "ViewShellImplementation.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "sdpage.hxx"
30cdf0e10cSrcweir #include "drawdoc.hxx"
31cdf0e10cSrcweir #include "sdresid.hxx"
32cdf0e10cSrcweir #include "glob.hrc"
33cdf0e10cSrcweir #include "app.hrc"
34cdf0e10cSrcweir #include "strings.hrc"
35cdf0e10cSrcweir #include "strings.hrc"
36cdf0e10cSrcweir #include "helpids.h"
37cdf0e10cSrcweir #include "sdattr.hxx"
38cdf0e10cSrcweir #include "sdabstdlg.hxx"
39cdf0e10cSrcweir #include "unmodpg.hxx"
40cdf0e10cSrcweir #include "Window.hxx"
41cdf0e10cSrcweir #include "optsitem.hxx"
42cdf0e10cSrcweir #include "DrawDocShell.hxx"
43cdf0e10cSrcweir #include "DrawController.hxx"
44cdf0e10cSrcweir #include "FactoryIds.hxx"
45cdf0e10cSrcweir #include "slideshow.hxx"
46cdf0e10cSrcweir #include "ViewShellBase.hxx"
47cdf0e10cSrcweir #include "FrameView.hxx"
48cdf0e10cSrcweir #include "DrawViewShell.hxx"
49cdf0e10cSrcweir #include "ViewShellHint.hxx"
507a32b0c8SAndre Fischer #include "SidebarPanelId.hxx"
51cdf0e10cSrcweir #include "framework/FrameworkHelper.hxx"
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <sfx2/bindings.hxx>
54cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
55cdf0e10cSrcweir #include <sfx2/request.hxx>
56*3091fa8aSAndre Fischer #include <sfx2/sidebar/Sidebar.hxx>
57cdf0e10cSrcweir #include <svl/aeitem.hxx>
58cdf0e10cSrcweir #include <svx/imapdlg.hxx>
59cdf0e10cSrcweir #include <vcl/msgbox.hxx>
60cdf0e10cSrcweir #include <basic/sbstar.hxx>
61cdf0e10cSrcweir #include "undo/undoobjects.hxx"
62cdf0e10cSrcweir 
63cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XControllerManager.hpp>
64cdf0e10cSrcweir 
65cdf0e10cSrcweir using namespace ::com::sun::star::uno;
66cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
67cdf0e10cSrcweir using ::sd::framework::FrameworkHelper;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir namespace sd {
70cdf0e10cSrcweir 
Implementation(ViewShell & rViewShell)71cdf0e10cSrcweir ViewShell::Implementation::Implementation (ViewShell& rViewShell)
72cdf0e10cSrcweir     : mbIsShowingUIControls(false),
73cdf0e10cSrcweir       mbIsMainViewShell(false),
74cdf0e10cSrcweir       mbIsInitialized(false),
75cdf0e10cSrcweir       mbArrangeActive(false),
76cdf0e10cSrcweir       mpSubShellFactory(),
77cdf0e10cSrcweir       mpUpdateLockForMouse(),
78cdf0e10cSrcweir       mrViewShell(rViewShell)
79cdf0e10cSrcweir {
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 
~Implementation(void)85cdf0e10cSrcweir ViewShell::Implementation::~Implementation (void)
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     if ( ! mpUpdateLockForMouse.expired())
88cdf0e10cSrcweir     {
89cdf0e10cSrcweir         ::boost::shared_ptr<ToolBarManagerLock> pLock(mpUpdateLockForMouse);
90cdf0e10cSrcweir         if (pLock.get() != NULL)
91cdf0e10cSrcweir         {
92cdf0e10cSrcweir             // Force the ToolBarManagerLock to be released even when the
93cdf0e10cSrcweir             // IsUICaptured() returns <TRUE/>.
94cdf0e10cSrcweir             pLock->Release(true);
95cdf0e10cSrcweir         }
96cdf0e10cSrcweir     }
97cdf0e10cSrcweir }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 
ProcessModifyPageSlot(SfxRequest & rRequest,SdPage * pCurrentPage,PageKind ePageKind)102cdf0e10cSrcweir void ViewShell::Implementation::ProcessModifyPageSlot (
103cdf0e10cSrcweir     SfxRequest& rRequest,
104cdf0e10cSrcweir     SdPage* pCurrentPage,
105cdf0e10cSrcweir     PageKind ePageKind)
106cdf0e10cSrcweir {
107cdf0e10cSrcweir     SdDrawDocument* pDocument = mrViewShell.GetDoc();
108cdf0e10cSrcweir     SdrLayerAdmin& rLayerAdmin = pDocument->GetLayerAdmin();
109cdf0e10cSrcweir     sal_uInt8 aBckgrnd = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False);
110cdf0e10cSrcweir     sal_uInt8 aBckgrndObj = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False);
111cdf0e10cSrcweir     SetOfByte aVisibleLayers;
112cdf0e10cSrcweir     sal_Bool bHandoutMode = sal_False;
113cdf0e10cSrcweir     SdPage* pHandoutMPage = NULL;
114cdf0e10cSrcweir     String aNewName;
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     // #95981#
117cdf0e10cSrcweir     String aOldName;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     AutoLayout aNewAutoLayout;
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     sal_Bool bBVisible;
122cdf0e10cSrcweir     sal_Bool bBObjsVisible;
123cdf0e10cSrcweir     const SfxItemSet* pArgs = rRequest.GetArgs();
124cdf0e10cSrcweir 
125cdf0e10cSrcweir     if (pCurrentPage != NULL && pCurrentPage->TRG_HasMasterPage())
126cdf0e10cSrcweir         aVisibleLayers = pCurrentPage->TRG_GetMasterPageVisibleLayers();
127cdf0e10cSrcweir     else
128cdf0e10cSrcweir         aVisibleLayers.SetAll();
129cdf0e10cSrcweir 
130cdf0e10cSrcweir     do
131cdf0e10cSrcweir     {
132cdf0e10cSrcweir         if (pCurrentPage == NULL)
133cdf0e10cSrcweir             break;
134cdf0e10cSrcweir 
135cdf0e10cSrcweir         if (!pArgs || pArgs->Count() == 1 || pArgs->Count() == 2 )
136cdf0e10cSrcweir         {
137cdf0e10cSrcweir             if (pArgs && pArgs->Count() == 2)
138cdf0e10cSrcweir             {
139cdf0e10cSrcweir                 // We have been called with a request that contains two
140cdf0e10cSrcweir                 // arguments.  One was used as preselected layout in a
141cdf0e10cSrcweir                 // dialog.  We could select that layout in the
142cdf0e10cSrcweir                 // layout panel instead.
143cdf0e10cSrcweir                 /*
144cdf0e10cSrcweir                     SFX_REQUEST_ARG (rRequest, pNewAutoLayout, SfxUInt32Item, ID_VAL_WHATLAYOUT, sal_False);
145cdf0e10cSrcweir                     eNewAutoLayout = (AutoLayout) pNewAutoLayout->GetValue
146cdf0e10cSrcweir                     ();
147cdf0e10cSrcweir                 */
148cdf0e10cSrcweir             }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir             // Make the layout menu visible in the tool pane.
151*3091fa8aSAndre Fischer             sfx2::sidebar::Sidebar::ShowPanel(
152*3091fa8aSAndre Fischer                 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImpressLayoutsPanel")),
153*3091fa8aSAndre Fischer                 mrViewShell.GetViewFrame()->GetFrame().GetFrameInterface());
154cdf0e10cSrcweir             break;
155cdf0e10cSrcweir         }
156cdf0e10cSrcweir         else if (pArgs->Count() == 4)
157cdf0e10cSrcweir         {
158cdf0e10cSrcweir             SFX_REQUEST_ARG (rRequest, pNewName, SfxStringItem, ID_VAL_PAGENAME, sal_False);
159cdf0e10cSrcweir             SFX_REQUEST_ARG (rRequest, pNewAutoLayout, SfxUInt32Item, ID_VAL_WHATLAYOUT, sal_False);
160cdf0e10cSrcweir             SFX_REQUEST_ARG (rRequest, pBVisible, SfxBoolItem, ID_VAL_ISPAGEBACK, sal_False);
161cdf0e10cSrcweir             SFX_REQUEST_ARG (rRequest, pBObjsVisible, SfxBoolItem, ID_VAL_ISPAGEOBJ, sal_False);
162cdf0e10cSrcweir             AutoLayout aLayout ((AutoLayout)pNewAutoLayout->GetValue ());
163cdf0e10cSrcweir             if (aLayout >= AUTOLAYOUT__START
164cdf0e10cSrcweir                 && aLayout < AUTOLAYOUT__END)
165cdf0e10cSrcweir             {
166cdf0e10cSrcweir                 aNewName		= pNewName->GetValue ();
167cdf0e10cSrcweir                 aNewAutoLayout = (AutoLayout) pNewAutoLayout->GetValue ();
168cdf0e10cSrcweir                 bBVisible		= pBVisible->GetValue ();
169cdf0e10cSrcweir                 bBObjsVisible	= pBObjsVisible->GetValue ();
170cdf0e10cSrcweir             }
171cdf0e10cSrcweir             else
172cdf0e10cSrcweir             {
173cdf0e10cSrcweir                 StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
174cdf0e10cSrcweir                 rRequest.Ignore ();
175cdf0e10cSrcweir                 break;
176cdf0e10cSrcweir             }
177cdf0e10cSrcweir             if (ePageKind == PK_HANDOUT)
178cdf0e10cSrcweir             {
179cdf0e10cSrcweir                 bHandoutMode = sal_True;
180cdf0e10cSrcweir                 pHandoutMPage = pDocument->GetMasterSdPage(0, PK_HANDOUT);
181cdf0e10cSrcweir             }
182cdf0e10cSrcweir         }
183cdf0e10cSrcweir         else
184cdf0e10cSrcweir         {
185cdf0e10cSrcweir             StarBASIC::FatalError (SbERR_WRONG_ARGS);
186cdf0e10cSrcweir             rRequest.Ignore ();
187cdf0e10cSrcweir             break;
188cdf0e10cSrcweir         }
189cdf0e10cSrcweir 
190cdf0e10cSrcweir         SdPage* pUndoPage =
191cdf0e10cSrcweir             bHandoutMode ? pHandoutMPage : pCurrentPage;
192cdf0e10cSrcweir 
193cdf0e10cSrcweir         ::svl::IUndoManager* pUndoManager = mrViewShell.GetDocSh()->GetUndoManager();
194cdf0e10cSrcweir         DBG_ASSERT(pUndoManager, "No UNDO MANAGER ?!?");
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 		if( pUndoManager )
197cdf0e10cSrcweir 		{
198cdf0e10cSrcweir 			String aComment( SdResId(STR_UNDO_MODIFY_PAGE) );
199cdf0e10cSrcweir 			pUndoManager->EnterListAction(aComment, aComment);
200cdf0e10cSrcweir 			ModifyPageUndoAction* pAction = new ModifyPageUndoAction(
201cdf0e10cSrcweir 				pDocument, pUndoPage, aNewName, aNewAutoLayout, bBVisible, bBObjsVisible);
202cdf0e10cSrcweir 			pUndoManager->AddUndoAction(pAction);
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 			// Clear the selection because the selectec object may be removed as
205cdf0e10cSrcweir 			// a result of the ssignment of the layout.
206cdf0e10cSrcweir 			mrViewShell.GetDrawView()->UnmarkAll();
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 			if (!bHandoutMode)
209cdf0e10cSrcweir 			{
210cdf0e10cSrcweir 				if (pCurrentPage->GetName() != aNewName)
211cdf0e10cSrcweir 				{
212cdf0e10cSrcweir 					pCurrentPage->SetName(aNewName);
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 					if (ePageKind == PK_STANDARD)
215cdf0e10cSrcweir 					{
216cdf0e10cSrcweir 						sal_uInt16 nPage = (pCurrentPage->GetPageNum()-1) / 2;
217cdf0e10cSrcweir 						SdPage* pNotesPage = pDocument->GetSdPage(nPage, PK_NOTES);
218cdf0e10cSrcweir 						if (pNotesPage != NULL)
219cdf0e10cSrcweir 							pNotesPage->SetName(aNewName);
220cdf0e10cSrcweir 					}
221cdf0e10cSrcweir 				}
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 				pCurrentPage->SetAutoLayout(aNewAutoLayout, sal_True);
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 				aBckgrnd = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False);
226cdf0e10cSrcweir 				aBckgrndObj = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False);
227cdf0e10cSrcweir 				aVisibleLayers.Set(aBckgrnd, bBVisible);
228cdf0e10cSrcweir 				aVisibleLayers.Set(aBckgrndObj, bBObjsVisible);
229cdf0e10cSrcweir 				pCurrentPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
230cdf0e10cSrcweir 			}
231cdf0e10cSrcweir 			else
232cdf0e10cSrcweir 			{
233cdf0e10cSrcweir 				pHandoutMPage->SetAutoLayout(aNewAutoLayout, sal_True);
234cdf0e10cSrcweir 			}
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 			mrViewShell.GetViewFrame()->GetDispatcher()->Execute(SID_SWITCHPAGE,
237cdf0e10cSrcweir 				SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 			sal_Bool bSetModified = sal_True;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 			if (pArgs && pArgs->Count() == 1)
242cdf0e10cSrcweir 			{
243cdf0e10cSrcweir 				bSetModified = (sal_Bool) ((SfxBoolItem&) pArgs->Get(SID_MODIFYPAGE)).GetValue();
244cdf0e10cSrcweir 			}
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 			pUndoManager->AddUndoAction( new UndoAutoLayoutPosAndSize( *pUndoPage ) );
247cdf0e10cSrcweir 			pUndoManager->LeaveListAction();
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 			pDocument->SetChanged(bSetModified);
250cdf0e10cSrcweir         }
251cdf0e10cSrcweir     }
252cdf0e10cSrcweir     while (false);
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     mrViewShell.Cancel();
255cdf0e10cSrcweir     rRequest.Done ();
256cdf0e10cSrcweir }
257cdf0e10cSrcweir 
AssignLayout(SfxRequest & rRequest,PageKind ePageKind)258cdf0e10cSrcweir void ViewShell::Implementation::AssignLayout ( SfxRequest& rRequest, PageKind ePageKind )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     const SfxUInt32Item* pWhatPage = static_cast< const SfxUInt32Item*  > ( rRequest.GetArg( ID_VAL_WHATPAGE, sal_False, TYPE(SfxUInt32Item) ) );
261cdf0e10cSrcweir     const SfxUInt32Item* pWhatLayout = static_cast< const SfxUInt32Item*  > ( rRequest.GetArg( ID_VAL_WHATLAYOUT, sal_False, TYPE(SfxUInt32Item) ) );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir     SdDrawDocument* pDocument = mrViewShell.GetDoc();
264cdf0e10cSrcweir 	if( !pDocument )
265cdf0e10cSrcweir 		return;
266cdf0e10cSrcweir 
267cdf0e10cSrcweir     SdPage* pPage = 0;
268cdf0e10cSrcweir     if( pWhatPage )
269cdf0e10cSrcweir     {
270cdf0e10cSrcweir 		pPage = pDocument->GetSdPage(static_cast<sal_uInt16>(pWhatPage->GetValue()), ePageKind);
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     if( pPage == 0 )
274cdf0e10cSrcweir         pPage = mrViewShell.getCurrentPage();
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     if( pPage )
277cdf0e10cSrcweir     {
278cdf0e10cSrcweir         AutoLayout eLayout = pPage->GetAutoLayout();
279cdf0e10cSrcweir 
280cdf0e10cSrcweir         if( pWhatLayout )
281cdf0e10cSrcweir             eLayout = static_cast< AutoLayout >( pWhatLayout->GetValue() );
282cdf0e10cSrcweir 
283cdf0e10cSrcweir         // Transform the given request into the four argument form that is
284cdf0e10cSrcweir         // understood by ProcessModifyPageSlot().
285cdf0e10cSrcweir         SdrLayerAdmin& rLayerAdmin (mrViewShell.GetViewShellBase().GetDocument()->GetLayerAdmin());
286cdf0e10cSrcweir         sal_uInt8 aBackground (rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False));
287cdf0e10cSrcweir         sal_uInt8 aBackgroundObject (rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False));
288cdf0e10cSrcweir 
289cdf0e10cSrcweir         SetOfByte aVisibleLayers;
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 		if( pPage->GetPageKind() == PK_HANDOUT )
292cdf0e10cSrcweir 			aVisibleLayers.SetAll();
293cdf0e10cSrcweir 		else
294cdf0e10cSrcweir 			aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 		SfxRequest aRequest (mrViewShell.GetViewShellBase().GetViewFrame(), SID_MODIFYPAGE);
297cdf0e10cSrcweir         aRequest.AppendItem(SfxStringItem (ID_VAL_PAGENAME, pPage->GetName()));
298cdf0e10cSrcweir         aRequest.AppendItem(SfxUInt32Item (ID_VAL_WHATLAYOUT, eLayout));
299cdf0e10cSrcweir         aRequest.AppendItem(SfxBoolItem(ID_VAL_ISPAGEBACK, aVisibleLayers.IsSet(aBackground)));
300cdf0e10cSrcweir         aRequest.AppendItem(SfxBoolItem(ID_VAL_ISPAGEOBJ, aVisibleLayers.IsSet(aBackgroundObject)));
301cdf0e10cSrcweir 
302cdf0e10cSrcweir         // Forward the call with the new arguments.
303cdf0e10cSrcweir         ProcessModifyPageSlot( aRequest, pPage, pPage->GetPageKind());
304cdf0e10cSrcweir     }
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 
GetViewId(void)310cdf0e10cSrcweir sal_uInt16 ViewShell::Implementation::GetViewId (void)
311cdf0e10cSrcweir {
312cdf0e10cSrcweir     switch (mrViewShell.GetShellType())
313cdf0e10cSrcweir     {
314cdf0e10cSrcweir         case ViewShell::ST_IMPRESS:
315cdf0e10cSrcweir         case ViewShell::ST_NOTES:
316cdf0e10cSrcweir         case ViewShell::ST_HANDOUT:
317cdf0e10cSrcweir             return IMPRESS_FACTORY_ID;
318cdf0e10cSrcweir 
319cdf0e10cSrcweir         case ViewShell::ST_DRAW:
320cdf0e10cSrcweir             return DRAW_FACTORY_ID;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir         case ViewShell::ST_OUTLINE:
323cdf0e10cSrcweir             return OUTLINE_FACTORY_ID;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir         case ViewShell::ST_SLIDE_SORTER:
326cdf0e10cSrcweir             return SLIDE_SORTER_FACTORY_ID;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir         case ViewShell::ST_PRESENTATION:
329cdf0e10cSrcweir             return PRESENTATION_FACTORY_ID;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir         // Since we have to return a view id for every possible shell type
332cdf0e10cSrcweir         // and there is not (yet) a proper ViewShellBase sub class for the
333cdf0e10cSrcweir         // remaining types we chose the Impress factory as a fall back.
3347a32b0c8SAndre Fischer         case ViewShell::ST_SIDEBAR:
335cdf0e10cSrcweir         case ViewShell::ST_NONE:
336cdf0e10cSrcweir         default:
337cdf0e10cSrcweir             return IMPRESS_FACTORY_ID;
338cdf0e10cSrcweir     }
339cdf0e10cSrcweir }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 
GetImageMapDialog(void)344cdf0e10cSrcweir SvxIMapDlg* ViewShell::Implementation::GetImageMapDialog (void)
345cdf0e10cSrcweir {
346cdf0e10cSrcweir     SvxIMapDlg* pDialog = NULL;
347cdf0e10cSrcweir     SfxChildWindow* pChildWindow = SfxViewFrame::Current()->GetChildWindow(
348cdf0e10cSrcweir         SvxIMapDlgChildWindow::GetChildWindowId());
349cdf0e10cSrcweir     if (pChildWindow != NULL)
350cdf0e10cSrcweir         pDialog = dynamic_cast<SvxIMapDlg*>(pChildWindow->GetWindow());
351cdf0e10cSrcweir     return pDialog;
352cdf0e10cSrcweir }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 
356cdf0e10cSrcweir //===== ToolBarManagerLock ====================================================
357cdf0e10cSrcweir 
358cdf0e10cSrcweir class ViewShell::Implementation::ToolBarManagerLock::Deleter { public:
operator ()(ToolBarManagerLock * pObject)359cdf0e10cSrcweir     void operator() (ToolBarManagerLock* pObject) { delete pObject; }
360cdf0e10cSrcweir };
361cdf0e10cSrcweir 
362cdf0e10cSrcweir ::boost::shared_ptr<ViewShell::Implementation::ToolBarManagerLock>
Create(const::boost::shared_ptr<ToolBarManager> & rpManager)363cdf0e10cSrcweir     ViewShell::Implementation::ToolBarManagerLock::Create (
364cdf0e10cSrcweir         const ::boost::shared_ptr<ToolBarManager>& rpManager)
365cdf0e10cSrcweir {
366cdf0e10cSrcweir     ::boost::shared_ptr<ToolBarManagerLock> pLock (
367cdf0e10cSrcweir         new ViewShell::Implementation::ToolBarManagerLock(rpManager),
368cdf0e10cSrcweir         ViewShell::Implementation::ToolBarManagerLock::Deleter());
369cdf0e10cSrcweir     pLock->mpSelf = pLock;
370cdf0e10cSrcweir     return pLock;
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 
ToolBarManagerLock(const::boost::shared_ptr<ToolBarManager> & rpManager)376cdf0e10cSrcweir ViewShell::Implementation::ToolBarManagerLock::ToolBarManagerLock (
377cdf0e10cSrcweir     const ::boost::shared_ptr<ToolBarManager>& rpManager)
378cdf0e10cSrcweir     : mpLock(new ToolBarManager::UpdateLock(rpManager)),
379cdf0e10cSrcweir       maTimer()
380cdf0e10cSrcweir {
381cdf0e10cSrcweir     // Start a timer that will unlock the ToolBarManager update lock when
382cdf0e10cSrcweir     // that is not done explicitly by calling Release().
383cdf0e10cSrcweir     maTimer.SetTimeoutHdl(LINK(this,ToolBarManagerLock,TimeoutCallback));
384cdf0e10cSrcweir     maTimer.SetTimeout(100);
385cdf0e10cSrcweir     maTimer.Start();
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
388cdf0e10cSrcweir 
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 
IMPL_LINK(ViewShell::Implementation::ToolBarManagerLock,TimeoutCallback,Timer *,EMPTYARG)391cdf0e10cSrcweir IMPL_LINK(ViewShell::Implementation::ToolBarManagerLock,TimeoutCallback,Timer*,EMPTYARG)
392cdf0e10cSrcweir {
393cdf0e10cSrcweir     // If possible then release the lock now.  Otherwise start the timer
394cdf0e10cSrcweir     // and try again later.
395cdf0e10cSrcweir     if (Application::IsUICaptured())
396cdf0e10cSrcweir     {
397cdf0e10cSrcweir         maTimer.Start();
398cdf0e10cSrcweir     }
399cdf0e10cSrcweir     else
400cdf0e10cSrcweir     {
401cdf0e10cSrcweir         mpSelf.reset();
402cdf0e10cSrcweir     }
403cdf0e10cSrcweir     return 0;
404cdf0e10cSrcweir }
405cdf0e10cSrcweir 
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 
Release(bool bForce)409cdf0e10cSrcweir void ViewShell::Implementation::ToolBarManagerLock::Release (bool bForce)
410cdf0e10cSrcweir {
411cdf0e10cSrcweir     // If possible then release the lock now.  Otherwise try again when the
412cdf0e10cSrcweir     // timer expires.
413cdf0e10cSrcweir     if (bForce || ! Application::IsUICaptured())
414cdf0e10cSrcweir     {
415cdf0e10cSrcweir         mpSelf.reset();
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir 
420cdf0e10cSrcweir 
421cdf0e10cSrcweir 
~ToolBarManagerLock(void)422cdf0e10cSrcweir ViewShell::Implementation::ToolBarManagerLock::~ToolBarManagerLock (void)
423cdf0e10cSrcweir {
424cdf0e10cSrcweir     mpLock.reset();
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
427cdf0e10cSrcweir } // end of namespace sd
428