1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27 #include <comphelper/processfactory.hxx>
28
29 #include <com/sun/star/frame/UnknownModuleException.hpp>
30 #include <com/sun/star/frame/XModuleManager.hpp>
31 #include <com/sun/star/container/XNameAccess.hpp>
32 #include <com/sun/star/beans/PropertyValue.hpp>
33
34 #include "ViewShellBase.hxx"
35 #include <algorithm>
36 #include "EventMultiplexer.hxx"
37 #include "cache/SlsPageCacheManager.hxx"
38 #include "sdresid.hxx"
39 #include "app.hrc"
40 #include "strings.hrc"
41 #include "glob.hrc"
42 #include "unokywds.hxx"
43 #include <svx/svxids.hrc>
44 #include "DrawDocShell.hxx"
45 #include <sfx2/app.hxx>
46 #include "PaneChildWindows.hxx"
47 #include "NotesChildWindow.hxx"
48 #include "ViewShellManager.hxx"
49 #include "DrawController.hxx"
50 #include "UpdateLockManager.hxx"
51 #include "FrameView.hxx"
52 #include "ViewTabBar.hxx"
53 #include <sfx2/event.hxx>
54 #include "drawdoc.hxx"
55 #include <sfx2/dispatch.hxx>
56 #include <sfx2/request.hxx>
57 #include <sfx2/printer.hxx>
58 #include "DrawViewShell.hxx"
59 #include "GraphicViewShell.hxx"
60 #include "OutlineViewShell.hxx"
61 #include "SlideSorterViewShell.hxx"
62 #include "PresentationViewShell.hxx"
63 #include "FormShellManager.hxx"
64 #include "ToolBarManager.hxx"
65 #include "SidebarPanelId.hxx"
66 #include "Window.hxx"
67 #include "framework/ConfigurationController.hxx"
68 #include "DocumentRenderer.hxx"
69
70 #include <com/sun/star/frame/XFrame.hpp>
71 #include <com/sun/star/awt/XWindow.hpp>
72 #include <com/sun/star/frame/XController.hpp>
73 #include <com/sun/star/frame/XModel.hpp>
74 #include <com/sun/star/document/XViewDataSupplier.hpp>
75 #include <com/sun/star/container/XIndexAccess.hpp>
76 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
77 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
78 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
79 #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
80 #include <com/sun/star/drawing/framework/ResourceId.hpp>
81 #include "framework/FrameworkHelper.hxx"
82
83 #include <rtl/ref.hxx>
84 #include <sfx2/msg.hxx>
85 #include <sfx2/objface.hxx>
86 #include <sfx2/viewfrm.hxx>
87 #include <svl/whiter.hxx>
88 #include <comphelper/processfactory.hxx>
89 #include <vcl/msgbox.hxx>
90 #include <tools/diagnose_ex.h>
91
92 #include "fubullet.hxx"
93
94 using namespace sd;
95 #define ViewShellBase
96 #include "sdslots.hxx"
97
98 using ::sd::framework::FrameworkHelper;
99 using ::rtl::OUString;
100 using namespace com::sun::star::uno;
101 using namespace com::sun::star::frame;
102 using namespace com::sun::star::container;
103 using namespace com::sun::star::lang;
104 using namespace com::sun::star::beans;
105
106 namespace {
107
108 class CurrentPageSetter
109 {
110 public:
111 CurrentPageSetter (ViewShellBase& rBase);
112 void operator () (bool);
113 private:
114 ViewShellBase& mrBase;
115 };
116
117 } // end of anonymous namespace
118
119
120 using namespace ::com::sun::star;
121 using namespace ::com::sun::star::uno;
122 using namespace ::com::sun::star::drawing::framework;
123 using ::sd::framework::FrameworkHelper;
124
125 namespace sd {
126
127 class ViewShellBase::Implementation
128 {
129 public:
130 /** Main controller of the view shell. During the switching from one
131 stacked shell to another this pointer may be NULL.
132 */
133 ::rtl::Reference<DrawController> mpController;
134
135 /** The view tab bar is the control for switching between different
136 views in one pane.
137 */
138 ::rtl::Reference<ViewTabBar> mpViewTabBar;
139
140 // contains the complete area of the current view relative to the frame window
141 Rectangle maClientArea;
142
143 // This is set to true when PrepareClose() is called.
144 bool mbIsClosing;
145
146 /** The view window is the parent of all UI elements that belong to the
147 view or ViewShell. This comprises the rulers, the scroll bars, and
148 the content window.
149 It does not include the ViewTabBar.
150 */
151 ::boost::scoped_ptr< ::Window> mpViewWindow;
152
153 ::boost::shared_ptr<ToolBarManager> mpToolBarManager;
154
155 ::boost::shared_ptr<ViewShellManager> mpViewShellManager;
156
157 ::boost::shared_ptr<tools::EventMultiplexer> mpEventMultiplexer;
158
159 ::boost::shared_ptr<UpdateLockManager> mpUpdateLockManager;
160
161 ::boost::shared_ptr<FormShellManager> mpFormShellManager;
162
163 Implementation (ViewShellBase& rBase);
164 ~Implementation (void);
165
166 void LateInit (void);
167
168 /** Show or hide the ViewTabBar.
169 @param bShow
170 When <TRUE/> then the ViewTabBar is shown, otherwise it is hidden.
171 */
172 void ShowViewTabBar (bool bShow);
173
174 /** Common code of ViewShellBase::OuterResizePixel() and
175 ViewShellBase::InnerResizePixel().
176 */
177 void ResizePixel (
178 const Point& rOrigin,
179 const Size& rSize,
180 bool bOuterResize);
181
182 /** Show or hide the specified pane. The visibility state is taken
183 fromthe given request.
184 @param rRequest
185 The request determines the new visibility state. The state can
186 either be toggled or be set to a given value.
187 @param rsPaneURL
188 This URL specifies the pane whose visibility state to set.
189 @param rsViewURL
190 When the pane becomes visible then this view URL specifies which
191 type of view to show in it.
192 */
193 void SetPaneVisibility (
194 const SfxRequest& rRequest,
195 const ::rtl::OUString& rsPaneURL,
196 const ::rtl::OUString& rsViewURL);
197
198 void GetSlotState (SfxItemSet& rSet);
199
200 void ProcessRestoreEditingViewSlot (void);
201
202 private:
203 ViewShellBase& mrBase;
204
205 /** Hold a reference to the page cache manager of the slide sorter in
206 order to ensure that it stays alive while the ViewShellBase is
207 alive.
208 */
209 ::boost::shared_ptr<slidesorter::cache::PageCacheManager> mpPageCacheManager;
210 };
211
212
213 namespace {
214 /** The only task of this window is to forward key presses to the content
215 window of the main view shell. With the key press it forwards the focus
216 so that it is not called very often.
217 */
218 class FocusForwardingWindow : public ::Window
219 {
220 public:
221 FocusForwardingWindow (::Window& rParentWindow, ViewShellBase& rBase);
222 virtual ~FocusForwardingWindow (void);
223 virtual void KeyInput (const KeyEvent& rEvent);
224 virtual void Command (const CommandEvent& rEvent);
225
226 private:
227 ViewShellBase& mrBase;
228 };
229 } // end of anonymous namespace
230
231
232 //===== ViewShellBase =========================================================
233
234 TYPEINIT1(ViewShellBase, SfxViewShell);
235
236 // We have to expand the SFX_IMPL_VIEWFACTORY macro to call LateInit() after a
237 // new ViewShellBase object has been constructed.
238
239 SfxViewFactory* ViewShellBase::pFactory;
CreateInstance(SfxViewFrame * pFrame,SfxViewShell * pOldView)240 SfxViewShell* __EXPORT ViewShellBase::CreateInstance (
241 SfxViewFrame *pFrame, SfxViewShell *pOldView)
242 {
243 ViewShellBase* pBase = new ViewShellBase(pFrame, pOldView);
244 pBase->LateInit(OUString());
245 return pBase;
246 }
RegisterFactory(sal_uInt16 nPrio)247 void ViewShellBase::RegisterFactory( sal_uInt16 nPrio )
248 {
249 pFactory = new SfxViewFactory(
250 &CreateInstance,&InitFactory,nPrio,"Default");
251 InitFactory();
252 }
InitFactory()253 void ViewShellBase::InitFactory()
254 {
255 SFX_VIEW_REGISTRATION(DrawDocShell);
256 }
257
258
259
SFX_IMPL_INTERFACE(ViewShellBase,SfxViewShell,SdResId (STR_VIEWSHELLBASE))260 SFX_IMPL_INTERFACE(ViewShellBase, SfxViewShell, SdResId(STR_VIEWSHELLBASE))
261 {
262 }
263
264
265
266
ViewShellBase(SfxViewFrame * _pFrame,SfxViewShell *)267 ViewShellBase::ViewShellBase (
268 SfxViewFrame* _pFrame,
269 SfxViewShell*)
270 : SfxViewShell (_pFrame,
271 SFX_VIEW_CAN_PRINT
272 | SFX_VIEW_HAS_PRINTOPTIONS),
273 maMutex(),
274 mpImpl(),
275 mpDocShell (NULL),
276 mpDocument (NULL)
277 {
278 mpImpl.reset(new Implementation(*this));
279 mpImpl->mpViewWindow.reset(new FocusForwardingWindow(_pFrame->GetWindow(),*this));
280 mpImpl->mpViewWindow->SetBackground(Wallpaper());
281 mpImpl->mpUpdateLockManager.reset(new UpdateLockManager(*this));
282
283 _pFrame->GetWindow().SetBackground(Wallpaper());
284
285 // Set up the members in the correct order.
286 if (GetViewFrame()->GetObjectShell()->ISA(DrawDocShell))
287 mpDocShell = static_cast<DrawDocShell*>(
288 GetViewFrame()->GetObjectShell());
289 if (mpDocShell != NULL)
290 mpDocument = mpDocShell->GetDoc();
291 mpImpl->mpViewShellManager.reset(new ViewShellManager(*this));
292
293 SetWindow(mpImpl->mpViewWindow.get());
294
295 // Hide the window to avoid complaints from Sfx...SwitchViewShell...
296 _pFrame->GetWindow().Hide();
297 }
298
299
300
301
302 /** In this destructor the order in which some of the members are destroyed
303 (and/or being prepared to being destroyed) is important. Change it only
304 when you know what you are doing.
305 */
~ViewShellBase(void)306 ViewShellBase::~ViewShellBase (void)
307 {
308 // Tell the controller that the ViewShellBase is not available anymore.
309 if (mpImpl->mpController.get() != NULL)
310 mpImpl->mpController->ReleaseViewShellBase();
311
312 // We have to hide the main window to prevent SFX complaining after a
313 // reload about it being already visible.
314 ViewShell* pShell = GetMainViewShell().get();
315 if (pShell!=NULL
316 && pShell->GetActiveWindow()!=NULL
317 && pShell->GetActiveWindow()->GetParent()!=NULL)
318 {
319 pShell->GetActiveWindow()->GetParent()->Hide();
320 }
321
322 mpImpl->mpUpdateLockManager->Disable();
323 mpImpl->mpToolBarManager->Shutdown();
324 mpImpl->mpViewShellManager->Shutdown();
325
326 EndListening(*GetViewFrame());
327 EndListening(*GetDocShell());
328
329 SetWindow(NULL);
330 }
331
332
333
334
LateInit(const::rtl::OUString & rsDefaultView)335 void ViewShellBase::LateInit (const ::rtl::OUString& rsDefaultView)
336 {
337 StartListening(*GetViewFrame(),sal_True);
338 StartListening(*GetDocShell(),sal_True);
339 mpImpl->LateInit();
340 InitializeFramework();
341
342 mpImpl->mpEventMultiplexer.reset(new tools::EventMultiplexer (*this));
343
344 mpImpl->mpFormShellManager.reset(new FormShellManager(*this));
345
346 mpImpl->mpToolBarManager = ToolBarManager::Create(
347 *this,
348 mpImpl->mpEventMultiplexer,
349 mpImpl->mpViewShellManager);
350
351 try
352 {
353 Reference<XControllerManager> xControllerManager (GetDrawController(), UNO_QUERY_THROW);
354 Reference<XConfigurationController> xConfigurationController (
355 xControllerManager->getConfigurationController());
356 if (xConfigurationController.is())
357 {
358 OUString sView (rsDefaultView);
359 if (sView.getLength() == 0)
360 sView = GetInitialViewShellType();
361
362 ::boost::shared_ptr<FrameworkHelper> pHelper (FrameworkHelper::Instance(*this));
363
364 // Create the resource ids for the center pane and view.
365 const Reference<drawing::framework::XResourceId> xCenterPaneId (
366 pHelper->CreateResourceId(FrameworkHelper::msCenterPaneURL));
367 const Reference<drawing::framework::XResourceId> xCenterViewId (
368 pHelper->CreateResourceId(sView, xCenterPaneId));
369
370 // Request center pane and view.
371 xConfigurationController->requestResourceActivation(xCenterPaneId, ResourceActivationMode_ADD);
372 xConfigurationController->requestResourceActivation(xCenterViewId, ResourceActivationMode_REPLACE);
373
374 // Process configuration events synchronously until the center view
375 // has been created.
376 sd::framework::ConfigurationController* pConfigurationController
377 = dynamic_cast<sd::framework::ConfigurationController*>(xConfigurationController.get());
378 if (pConfigurationController != NULL)
379 {
380 while (
381 ! pConfigurationController->getResource(xCenterViewId).is()
382 && pConfigurationController->hasPendingRequests())
383 {
384 pConfigurationController->ProcessEvent();
385 }
386 }
387 }
388 }
389 catch (RuntimeException&)
390 {}
391
392 // AutoLayouts have to be ready.
393 GetDocument()->StopWorkStartupDelay();
394
395 UpdateBorder();
396
397 // Remember the type of the current main view shell in the frame view.
398 ViewShell* pViewShell = GetMainViewShell().get();
399 if (pViewShell != NULL)
400 {
401 FrameView* pFrameView = pViewShell->GetFrameView();
402 if (pFrameView != NULL)
403 pFrameView->SetViewShellTypeOnLoad(pViewShell->GetShellType());
404 }
405 }
406
407
408
409
GetViewShellManager(void) const410 ::boost::shared_ptr<ViewShellManager> ViewShellBase::GetViewShellManager (void) const
411 {
412 return mpImpl->mpViewShellManager;
413 }
414
415
416
417
GetMainViewShell(void) const418 ::boost::shared_ptr<ViewShell> ViewShellBase::GetMainViewShell (void) const
419 {
420 ::boost::shared_ptr<ViewShell> pMainViewShell (
421 framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))
422 ->GetViewShell(framework::FrameworkHelper::msCenterPaneURL));
423 if (pMainViewShell.get() == NULL)
424 pMainViewShell = framework::FrameworkHelper::Instance(*const_cast<ViewShellBase*>(this))
425 ->GetViewShell(framework::FrameworkHelper::msFullScreenPaneURL);
426 return pMainViewShell;
427 }
428
429
430
431
GetViewShellBase(SfxViewFrame * pViewFrame)432 ViewShellBase* ViewShellBase::GetViewShellBase (SfxViewFrame* pViewFrame)
433 {
434 ViewShellBase* pBase = NULL;
435
436 if (pViewFrame != NULL)
437 {
438 // Get the view shell for the frame and cast it to
439 // sd::ViewShellBase.
440 SfxViewShell* pSfxViewShell = pViewFrame->GetViewShell();
441 if (pSfxViewShell!=NULL && pSfxViewShell->ISA(::sd::ViewShellBase))
442 pBase = static_cast<ViewShellBase*>(pSfxViewShell);
443 }
444
445 return pBase;
446 }
447
448
449
450
GetDocShell(void) const451 DrawDocShell* ViewShellBase::GetDocShell (void) const
452 {
453 return mpDocShell;
454 }
455
456
457
GetDocument(void) const458 SdDrawDocument* ViewShellBase::GetDocument (void) const
459 {
460 return mpDocument;
461 }
462
463
464
465
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)466 void ViewShellBase::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
467 {
468 SfxViewShell::Notify(rBC, rHint);
469
470 if (rHint.IsA(TYPE(SfxEventHint)))
471 {
472 switch (static_cast<const SfxEventHint&>(rHint).GetEventId())
473 {
474 case SFX_EVENT_OPENDOC:
475 if( GetDocument() && GetDocument()->IsStartWithPresentation() )
476 {
477 if( GetViewFrame() )
478 {
479 GetDocument()->SetStartWithPresentation( false );
480 GetViewFrame()->GetDispatcher()->Execute(
481 SID_PRESENTATION, SFX_CALLMODE_ASYNCHRON );
482 }
483 }
484 else
485 {
486 // mpPaneManager->InitPanes();
487 }
488 break;
489
490 default:
491 break;
492 }
493 }
494 }
495
496
497
498
InitializeFramework(void)499 void ViewShellBase::InitializeFramework (void)
500 {
501 }
502
503
504
505
InnerResizePixel(const Point & rOrigin,const Size & rSize)506 void ViewShellBase::InnerResizePixel (const Point& rOrigin, const Size &rSize)
507 {
508 Size aObjSize = GetObjectShell()->GetVisArea().GetSize();
509 if ( aObjSize.Width() > 0 && aObjSize.Height() > 0 )
510 {
511 SvBorder aBorder( GetBorderPixel() );
512 Size aSize( rSize );
513 aSize.Width() -= (aBorder.Left() + aBorder.Right());
514 aSize.Height() -= (aBorder.Top() + aBorder.Bottom());
515 Size aObjSizePixel = mpImpl->mpViewWindow->LogicToPixel( aObjSize, MAP_100TH_MM );
516 SfxViewShell::SetZoomFactor(
517 Fraction( aSize.Width(), std::max( aObjSizePixel.Width(), (long int)1 ) ),
518 Fraction( aSize.Height(), std::max( aObjSizePixel.Height(), (long int)1) ) );
519 }
520
521 mpImpl->ResizePixel(rOrigin, rSize, false);
522 }
523
524
525
526
OuterResizePixel(const Point & rOrigin,const Size & rSize)527 void ViewShellBase::OuterResizePixel (const Point& rOrigin, const Size &rSize)
528 {
529 mpImpl->ResizePixel (rOrigin, rSize, true);
530 }
531
532
533
534
Rearrange(void)535 void ViewShellBase::Rearrange (void)
536 {
537 OSL_ASSERT(GetViewFrame()!=NULL);
538
539 // There is a bug in the communication between embedded objects and the
540 // framework::LayoutManager that leads to missing resize updates. The
541 // following workaround enforces such an update by cycling the border to
542 // zero and back to the current value.
543 if (GetWindow() != NULL)
544 {
545 SetBorderPixel(SvBorder());
546 UpdateBorder(true);
547 }
548 else
549 {
550 OSL_TRACE("Rearrange: window missing");
551 }
552
553 GetViewFrame()->Resize(sal_True);
554 }
555
556
557
558
DoVerb(long nVerb)559 ErrCode ViewShellBase::DoVerb (long nVerb)
560 {
561 ErrCode aResult = ERRCODE_NONE;
562
563 ::sd::ViewShell* pShell = GetMainViewShell().get();
564 if (pShell != NULL)
565 aResult = pShell->DoVerb (nVerb);
566
567 return aResult;
568 }
569
570
571
572
GetRenderable(void)573 Reference<view::XRenderable> ViewShellBase::GetRenderable (void)
574 {
575 // Create a new DocumentRenderer on every call. It observes the life
576 // time of this ViewShellBase object.
577 return Reference<view::XRenderable>(new DocumentRenderer(*this));
578 }
579
580
581
582
GetPrinter(sal_Bool bCreate)583 SfxPrinter* ViewShellBase::GetPrinter (sal_Bool bCreate)
584 {
585 OSL_ASSERT(mpImpl.get()!=NULL);
586
587 return GetDocShell()->GetPrinter (bCreate);
588 }
589
590
591
592
SetPrinter(SfxPrinter * pNewPrinter,sal_uInt16 nDiffFlags,bool bIsAPI)593 sal_uInt16 ViewShellBase::SetPrinter (
594 SfxPrinter* pNewPrinter,
595 sal_uInt16 nDiffFlags,
596 bool bIsAPI)
597 {
598 OSL_ASSERT(mpImpl.get()!=NULL);
599
600 GetDocShell()->SetPrinter(pNewPrinter);
601
602 if ( (nDiffFlags & SFX_PRINTER_CHG_ORIENTATION ||
603 nDiffFlags & SFX_PRINTER_CHG_SIZE) && pNewPrinter )
604 {
605 MapMode aMap = pNewPrinter->GetMapMode();
606 aMap.SetMapUnit(MAP_100TH_MM);
607 MapMode aOldMap = pNewPrinter->GetMapMode();
608 pNewPrinter->SetMapMode(aMap);
609 Size aNewSize = pNewPrinter->GetOutputSize();
610
611 sal_Bool bScaleAll = sal_False;
612 if ( bIsAPI )
613 {
614 WarningBox aWarnBox (
615 GetWindow(),
616 (WinBits)(WB_YES_NO | WB_DEF_YES),
617 String(SdResId(STR_SCALE_OBJS_TO_PAGE)));
618 bScaleAll = (aWarnBox.Execute() == RET_YES);
619 }
620
621 ::boost::shared_ptr<DrawViewShell> pDrawViewShell (
622 ::boost::dynamic_pointer_cast<DrawViewShell>(GetMainViewShell()));
623 if (pDrawViewShell)
624 {
625 SdPage* pPage = GetDocument()->GetSdPage(
626 0, PK_STANDARD );
627 pDrawViewShell->SetPageSizeAndBorder (
628 pDrawViewShell->GetPageKind(),
629 aNewSize,
630 -1,-1,-1,-1,
631 bScaleAll,
632 pNewPrinter->GetOrientation(),
633 pPage->GetPaperBin(),
634 pPage->IsBackgroundFullSize());
635 }
636
637 pNewPrinter->SetMapMode(aOldMap);
638 }
639
640 return 0;
641 }
642
643
644
645
CreatePrintOptionsPage(::Window * pParent,const SfxItemSet & rOptions)646 SfxTabPage* ViewShellBase::CreatePrintOptionsPage(
647 ::Window *pParent,
648 const SfxItemSet &rOptions)
649 {
650 (void)pParent;
651 (void)rOptions;
652 return NULL;
653 // return mpImpl->mpPrintManager->CreatePrintOptionsPage (pParent, rOptions);
654 }
655
656
657
658
UIActivating(SfxInPlaceClient * pClient)659 void ViewShellBase::UIActivating( SfxInPlaceClient* pClient )
660 {
661 mpImpl->ShowViewTabBar(false);
662
663 ViewShell* pViewShell = GetMainViewShell().get();
664 if ( pViewShell )
665 pViewShell->UIActivating( pClient );
666
667 SfxViewShell::UIActivating( pClient );
668 }
669
670
671
672
UIDeactivated(SfxInPlaceClient * pClient)673 void ViewShellBase::UIDeactivated( SfxInPlaceClient* pClient )
674 {
675 SfxViewShell::UIDeactivated( pClient );
676
677 mpImpl->ShowViewTabBar(true);
678
679 ViewShell* pViewShell = GetMainViewShell().get();
680 if ( pViewShell )
681 pViewShell->UIDeactivated( pClient );
682 }
683
684
685
686
GetBorder(bool)687 SvBorder ViewShellBase::GetBorder (bool )
688 {
689 int nTop = 0;
690 if (mpImpl->mpViewTabBar.is() && mpImpl->mpViewTabBar->GetTabControl()->IsVisible())
691 nTop = mpImpl->mpViewTabBar->GetHeight();
692 return SvBorder(0,nTop,0,0);
693 }
694
695
696
697
Execute(SfxRequest & rRequest)698 void ViewShellBase::Execute (SfxRequest& rRequest)
699 {
700 sal_uInt16 nSlotId = rRequest.GetSlot();
701
702 switch (nSlotId)
703 {
704 case SID_SWITCH_SHELL:
705 {
706 Reference<XControllerManager> xControllerManager (GetController(), UNO_QUERY);
707 if (xControllerManager.is())
708 {
709 Reference<XConfigurationController> xConfigurationController (
710 xControllerManager->getConfigurationController());
711 if (xConfigurationController.is())
712 xConfigurationController->update();
713 }
714 }
715 break;
716
717 case SID_LEFT_PANE_DRAW:
718 mpImpl->SetPaneVisibility(
719 rRequest,
720 framework::FrameworkHelper::msLeftDrawPaneURL,
721 framework::FrameworkHelper::msSlideSorterURL);
722 break;
723
724 case SID_LEFT_PANE_IMPRESS:
725 mpImpl->SetPaneVisibility(
726 rRequest,
727 framework::FrameworkHelper::msLeftImpressPaneURL,
728 framework::FrameworkHelper::msSlideSorterURL);
729 break;
730
731 case SID_NORMAL_MULTI_PANE_GUI:
732 case SID_SLIDE_SORTER_MULTI_PANE_GUI:
733 case SID_DRAWINGMODE:
734 case SID_DIAMODE:
735 case SID_OUTLINEMODE:
736 case SID_NOTESMODE:
737 case SID_HANDOUTMODE:
738 framework::FrameworkHelper::Instance(*this)->HandleModeChangeSlot(nSlotId, rRequest);
739 break;
740
741 case SID_WIN_FULLSCREEN:
742 // The full screen mode is not supported. Ignore the request.
743 break;
744
745 case SID_RESTORE_EDITING_VIEW:
746 mpImpl->ProcessRestoreEditingViewSlot();
747 break;
748
749 default:
750 // Ignore any other slot.
751 rRequest.Ignore ();
752 break;
753 }
754 }
755
756
757
758
GetState(SfxItemSet & rSet)759 void ViewShellBase::GetState (SfxItemSet& rSet)
760 {
761 // The full screen mode is not supported. Disable the the slot so that
762 // it appears grayed out when somebody uses configures the menu to show
763 // an menu item for it.
764 // if (rSet.GetItemState(SID_WIN_FULLSCREEN) == SFX_ITEM_AVAILABLE)
765 // rSet.DisableItem(SID_WIN_FULLSCREEN);
766
767 mpImpl->GetSlotState(rSet);
768
769 FuBullet::GetSlotState( rSet, 0, GetViewFrame() );
770 }
771
772
773
774
WriteUserDataSequence(::com::sun::star::uno::Sequence<::com::sun::star::beans::PropertyValue> & rSequence,sal_Bool bBrowse)775 void ViewShellBase::WriteUserDataSequence (
776 ::com::sun::star::uno::Sequence <
777 ::com::sun::star::beans::PropertyValue >& rSequence,
778 sal_Bool bBrowse)
779 {
780 // Forward call to main sub shell.
781 ViewShell* pShell = GetMainViewShell().get();
782 if (pShell != NULL)
783 pShell->WriteUserDataSequence (rSequence, bBrowse);
784 }
785
786
787
788
ReadUserDataSequence(const::com::sun::star::uno::Sequence<::com::sun::star::beans::PropertyValue> & rSequence,sal_Bool bBrowse)789 void ViewShellBase::ReadUserDataSequence (
790 const ::com::sun::star::uno::Sequence <
791 ::com::sun::star::beans::PropertyValue >& rSequence,
792 sal_Bool bBrowse)
793 {
794 // Forward call to main sub shell.
795 ViewShell* pShell = GetMainViewShell().get();
796 if (pShell != NULL)
797 {
798 pShell->ReadUserDataSequence (rSequence, bBrowse);
799
800 // For certain shell types ReadUserDataSequence may have changed the
801 // type to another one. Make sure that the center pane shows the
802 // right view shell.
803 switch (pShell->GetShellType())
804 {
805 case ViewShell::ST_IMPRESS:
806 case ViewShell::ST_NOTES:
807 case ViewShell::ST_HANDOUT:
808 {
809 ::rtl::OUString sViewURL;
810 switch (PTR_CAST(DrawViewShell, pShell)->GetPageKind())
811 {
812 default:
813 case PK_STANDARD:
814 sViewURL = framework::FrameworkHelper::msImpressViewURL;
815 break;
816 case PK_NOTES:
817 sViewURL = framework::FrameworkHelper::msNotesViewURL;
818 break;
819 case PK_HANDOUT:
820 sViewURL = framework::FrameworkHelper::msHandoutViewURL;
821 break;
822 }
823 if (sViewURL.getLength() > 0)
824 framework::FrameworkHelper::Instance(*this)->RequestView(
825 sViewURL,
826 framework::FrameworkHelper::msCenterPaneURL);
827 }
828 break;
829
830 default:
831 break;
832 }
833 }
834 }
835
836
837
838
Activate(sal_Bool bIsMDIActivate)839 void ViewShellBase::Activate (sal_Bool bIsMDIActivate)
840 {
841 SfxViewShell::Activate(bIsMDIActivate);
842
843 Reference<XControllerManager> xControllerManager (GetController(), UNO_QUERY);
844 if (xControllerManager.is())
845 {
846 Reference<XConfigurationController> xConfigurationController (
847 xControllerManager->getConfigurationController());
848 if (xConfigurationController.is())
849 xConfigurationController->update();
850 }
851 GetToolBarManager()->RequestUpdate();
852 }
853
854
855
856
Deactivate(sal_Bool bIsMDIActivate)857 void ViewShellBase::Deactivate (sal_Bool bIsMDIActivate)
858 {
859 SfxViewShell::Deactivate(bIsMDIActivate);
860 }
861
862
863
864
SetZoomFactor(const Fraction & rZoomX,const Fraction & rZoomY)865 void ViewShellBase::SetZoomFactor (
866 const Fraction &rZoomX,
867 const Fraction &rZoomY)
868 {
869 SfxViewShell::SetZoomFactor (rZoomX, rZoomY);
870 // Forward call to main sub shell.
871 ViewShell* pShell = GetMainViewShell().get();
872 if (pShell != NULL)
873 pShell->SetZoomFactor (rZoomX, rZoomY);
874 }
875
876
877
878
PrepareClose(sal_Bool bUI,sal_Bool bForBrowsing)879 sal_uInt16 ViewShellBase::PrepareClose (sal_Bool bUI, sal_Bool bForBrowsing)
880 {
881 sal_uInt16 nResult = SfxViewShell::PrepareClose (bUI, bForBrowsing);
882
883 if (nResult == sal_True)
884 {
885 mpImpl->mbIsClosing = true;
886
887 // Forward call to main sub shell.
888 ViewShell* pShell = GetMainViewShell().get();
889 if (pShell != NULL)
890 nResult = pShell->PrepareClose (bUI, bForBrowsing);
891 }
892
893 return nResult;
894 }
895
896
897
898
WriteUserData(String & rString,sal_Bool bBrowse)899 void ViewShellBase::WriteUserData (String& rString, sal_Bool bBrowse)
900 {
901 SfxViewShell::WriteUserData (rString, bBrowse);
902
903 // Forward call to main sub shell.
904 ViewShell* pShell = GetMainViewShell().get();
905 if (pShell != NULL)
906 pShell->WriteUserData (rString);
907 }
908
909
910
911
ReadUserData(const String & rString,sal_Bool bBrowse)912 void ViewShellBase::ReadUserData (const String& rString, sal_Bool bBrowse)
913 {
914 SfxViewShell::ReadUserData (rString, bBrowse);
915
916 // Forward call to main sub shell.
917 ViewShell* pShell = GetMainViewShell().get();
918 if (pShell != NULL)
919 pShell->ReadUserData (rString);
920 }
921
922
923
924
GetDrawView(void) const925 SdrView* ViewShellBase::GetDrawView (void) const
926 {
927 // Forward call to main sub shell.
928 ViewShell* pShell = GetMainViewShell().get();
929 if (pShell != NULL)
930 return pShell->GetDrawView ();
931 else
932 return SfxViewShell::GetDrawView();
933 }
934
935
936
937
AdjustPosSizePixel(const Point & rOfs,const Size & rSize)938 void ViewShellBase::AdjustPosSizePixel (const Point &rOfs, const Size &rSize)
939 {
940 SfxViewShell::AdjustPosSizePixel (rOfs, rSize);
941 }
942
943
944
945
SetBusyState(bool bBusy)946 void ViewShellBase::SetBusyState (bool bBusy)
947 {
948 if (GetDocShell() != NULL)
949 GetDocShell()->SetWaitCursor (bBusy);
950 }
951
952
953
954
UpdateBorder(bool bForce)955 void ViewShellBase::UpdateBorder ( bool bForce /* = false */ )
956 {
957 // The following calls to SetBorderPixel() and InvalidateBorder() are
958 // made only for the main view shell. This not only avoids unnecessary
959 // calls for the views in side panes but prevents calling an already
960 // dying SfxViewShell base class.
961 // For issue #140703# we have to check the existence of the window,
962 // too. The SfxViewFrame accesses the window without checking it.
963 ViewShell* pMainViewShell = GetMainViewShell().get();
964 if (pMainViewShell != NULL && GetWindow()!=NULL)
965 {
966 SvBorder aCurrentBorder (GetBorderPixel());
967 bool bOuterResize ( ! GetDocShell()->IsInPlaceActive());
968 SvBorder aBorder (GetBorder(bOuterResize));
969 aBorder += pMainViewShell->GetBorder(bOuterResize);
970
971 if (bForce || (aBorder != aCurrentBorder))
972 {
973 SetBorderPixel (aBorder);
974 InvalidateBorder();
975 }
976 }
977 }
978
979
980
981
ShowUIControls(bool bVisible)982 void ViewShellBase::ShowUIControls (bool bVisible)
983 {
984 if (mpImpl->mpViewTabBar.is())
985 mpImpl->mpViewTabBar->GetTabControl()->Show(bVisible);
986
987 ViewShell* pMainViewShell = GetMainViewShell().get();
988 if (pMainViewShell != NULL)
989 pMainViewShell->ShowUIControls (bVisible);
990
991 UpdateBorder();
992 if (bVisible)
993 Rearrange();
994 }
995
996
997
998
GetInitialViewShellType(void)999 OUString ViewShellBase::GetInitialViewShellType (void)
1000 {
1001 OUString sRequestedView (FrameworkHelper::msImpressViewURL);
1002
1003 do
1004 {
1005 Reference<document::XViewDataSupplier> xViewDataSupplier (
1006 GetDocShell()->GetModel(), UNO_QUERY);
1007 if ( ! xViewDataSupplier.is())
1008 break;
1009
1010 Reference<container::XIndexAccess> xViewData (xViewDataSupplier->getViewData());
1011 if ( ! xViewData.is())
1012 break;
1013 if (xViewData->getCount() == 0)
1014 break;
1015
1016 sal_Int32 nView = 0;
1017 ::com::sun::star::uno::Any aAny = xViewData->getByIndex(nView);
1018 Sequence<beans::PropertyValue> aProperties;
1019 if ( ! (aAny >>= aProperties))
1020 break;
1021
1022 // Search the properties for the one that tells us what page kind to
1023 // use.
1024 for (sal_Int32 n=0; n<aProperties.getLength(); n++)
1025 {
1026 const beans::PropertyValue& rProperty (aProperties[n]);
1027 if (rProperty.Name.compareToAscii(sUNO_View_PageKind) == COMPARE_EQUAL)
1028 {
1029 sal_Int16 nPageKind = 0;
1030 rProperty.Value >>= nPageKind;
1031 switch ((PageKind)nPageKind)
1032 {
1033 case PK_STANDARD:
1034 sRequestedView = FrameworkHelper::msImpressViewURL;
1035 break;
1036
1037 case PK_HANDOUT:
1038 sRequestedView = FrameworkHelper::msHandoutViewURL;
1039 break;
1040
1041 case PK_NOTES:
1042 sRequestedView = FrameworkHelper::msNotesViewURL;
1043 break;
1044
1045 default:
1046 // The page kind is invalid. This is propably an
1047 // error by the caller. We use the standard type to
1048 // keep things going.
1049 DBG_ASSERT(sal_False, "ViewShellBase::GetInitialViewShellType: invalid page kind");
1050 sRequestedView = FrameworkHelper::msImpressViewURL;
1051 break;
1052 }
1053 break;
1054 }
1055 }
1056 }
1057 while (false);
1058
1059 return sRequestedView;
1060 }
1061
1062
1063
1064
1065 /** this method starts the presentation by
1066 executing the slot SID_PRESENTATION asynchronous */
StartPresentation()1067 void ViewShellBase::StartPresentation()
1068 {
1069 if( GetViewFrame() && GetViewFrame()->GetDispatcher() )
1070 GetViewFrame()->GetDispatcher()->Execute(SID_PRESENTATION, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
1071 }
1072
1073
1074
1075
1076
GetEventMultiplexer(void)1077 ::boost::shared_ptr<tools::EventMultiplexer> ViewShellBase::GetEventMultiplexer (void)
1078 {
1079 OSL_ASSERT(mpImpl.get()!=NULL);
1080 OSL_ASSERT(mpImpl->mpEventMultiplexer.get()!=NULL);
1081
1082 return mpImpl->mpEventMultiplexer;
1083 }
1084
1085
1086
1087
getClientRectangle(void) const1088 const Rectangle& ViewShellBase::getClientRectangle (void) const
1089 {
1090 return mpImpl->maClientArea;
1091 }
1092
1093
1094
1095
GetUpdateLockManager(void) const1096 ::boost::shared_ptr<UpdateLockManager> ViewShellBase::GetUpdateLockManager (void) const
1097 {
1098 OSL_ASSERT(mpImpl.get()!=NULL);
1099 OSL_ASSERT(mpImpl->mpUpdateLockManager.get()!=NULL);
1100
1101 return mpImpl->mpUpdateLockManager;
1102 }
1103
1104
1105
1106
GetToolBarManager(void) const1107 ::boost::shared_ptr<ToolBarManager> ViewShellBase::GetToolBarManager (void) const
1108 {
1109 OSL_ASSERT(mpImpl.get()!=NULL);
1110 OSL_ASSERT(mpImpl->mpToolBarManager.get()!=NULL);
1111
1112 return mpImpl->mpToolBarManager;
1113 }
1114
1115
1116
1117
GetFormShellManager(void) const1118 ::boost::shared_ptr<FormShellManager> ViewShellBase::GetFormShellManager (void) const
1119 {
1120 OSL_ASSERT(mpImpl.get()!=NULL);
1121 OSL_ASSERT(mpImpl->mpFormShellManager.get()!=NULL);
1122
1123 return mpImpl->mpFormShellManager;
1124 }
1125
1126
1127
1128
GetDrawController(void) const1129 DrawController& ViewShellBase::GetDrawController (void) const
1130 {
1131 OSL_ASSERT(mpImpl.get()!=NULL);
1132
1133 return *mpImpl->mpController;
1134 }
1135
1136
1137
1138
SetViewTabBar(const::rtl::Reference<ViewTabBar> & rViewTabBar)1139 void ViewShellBase::SetViewTabBar (const ::rtl::Reference<ViewTabBar>& rViewTabBar)
1140 {
1141 OSL_ASSERT(mpImpl.get()!=NULL);
1142
1143 mpImpl->mpViewTabBar = rViewTabBar;
1144 }
1145
1146
1147
1148
GetViewWindow(void)1149 ::Window* ViewShellBase::GetViewWindow (void)
1150 {
1151 OSL_ASSERT(mpImpl.get()!=NULL);
1152
1153 return mpImpl->mpViewWindow.get();
1154 }
1155
1156
ImplRetrieveLabelFromCommand(const Reference<XFrame> & xFrame,const::rtl::OUString & aCmdURL)1157 ::rtl::OUString ImplRetrieveLabelFromCommand( const Reference< XFrame >& xFrame, const ::rtl::OUString& aCmdURL )
1158 {
1159 ::rtl::OUString aLabel;
1160
1161 if ( aCmdURL.getLength() > 0 ) try
1162 {
1163 Reference< XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW );
1164
1165 Reference< XModuleManager > xModuleManager( xServiceManager->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ModuleManager") ) ), UNO_QUERY_THROW );
1166 Reference< XInterface > xIfac( xFrame, UNO_QUERY_THROW );
1167
1168 ::rtl::OUString aModuleIdentifier( xModuleManager->identify( xIfac ) );
1169
1170 if( aModuleIdentifier.getLength() > 0 )
1171 {
1172 Reference< XNameAccess > xNameAccess( xServiceManager->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.UICommandDescription" ) ) ), UNO_QUERY );
1173 if( xNameAccess.is() )
1174 {
1175 Reference< ::com::sun::star::container::XNameAccess > m_xUICommandLabels( xNameAccess->getByName( aModuleIdentifier ), UNO_QUERY_THROW );
1176 Sequence< PropertyValue > aPropSeq;
1177 if( m_xUICommandLabels->getByName( aCmdURL ) >>= aPropSeq )
1178 {
1179 for( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
1180 {
1181 if( aPropSeq[i].Name.equalsAscii( "Name" ))
1182 {
1183 aPropSeq[i].Value >>= aLabel;
1184 break;
1185 }
1186 }
1187 }
1188 }
1189 }
1190 }
1191 catch ( Exception& )
1192 {
1193 }
1194
1195 return aLabel;
1196 }
1197
RetrieveLabelFromCommand(const::rtl::OUString & aCmdURL) const1198 ::rtl::OUString ViewShellBase::RetrieveLabelFromCommand( const ::rtl::OUString& aCmdURL ) const
1199 {
1200 Reference< XFrame > xFrame( GetMainViewShell()->GetViewFrame()->GetFrame().GetFrameInterface(), UNO_QUERY );
1201 return ImplRetrieveLabelFromCommand( xFrame, aCmdURL );
1202 }
1203
1204
1205
1206 //===== ViewShellBase::Implementation =========================================
1207
Implementation(ViewShellBase & rBase)1208 ViewShellBase::Implementation::Implementation (ViewShellBase& rBase)
1209 : mpController(),
1210 mpViewTabBar(),
1211 maClientArea(),
1212 mbIsClosing(false),
1213 mpViewWindow(),
1214 mpToolBarManager(),
1215 mpViewShellManager(),
1216 mpEventMultiplexer(),
1217 mpUpdateLockManager(),
1218 mpFormShellManager(),
1219 mrBase(rBase),
1220 mpPageCacheManager(slidesorter::cache::PageCacheManager::Instance())
1221 {
1222 }
1223
1224
1225
1226
~Implementation(void)1227 ViewShellBase::Implementation::~Implementation (void)
1228 {
1229 mpController = NULL;
1230 mpViewTabBar = NULL;
1231 mpViewWindow.reset();
1232 mpToolBarManager.reset();
1233 }
1234
1235
1236
1237
LateInit(void)1238 void ViewShellBase::Implementation::LateInit (void)
1239 {
1240 mpController = new DrawController(mrBase);
1241 }
1242
1243
1244
1245
ProcessRestoreEditingViewSlot(void)1246 void ViewShellBase::Implementation::ProcessRestoreEditingViewSlot (void)
1247 {
1248 ViewShell* pViewShell = mrBase.GetMainViewShell().get();
1249 if (pViewShell != NULL)
1250 {
1251 FrameView* pFrameView = pViewShell->GetFrameView();
1252 if (pFrameView != NULL)
1253 {
1254 // Set view shell, edit mode, and page kind.
1255 pFrameView->SetViewShEditMode(
1256 pFrameView->GetViewShEditModeOnLoad(),
1257 pFrameView->GetPageKindOnLoad());
1258 pFrameView->SetPageKind(
1259 pFrameView->GetPageKindOnLoad());
1260 ::boost::shared_ptr<FrameworkHelper> pHelper (FrameworkHelper::Instance(mrBase));
1261 pHelper->RequestView(
1262 pHelper->GetViewURL(pFrameView->GetViewShellTypeOnLoad()),
1263 FrameworkHelper::msCenterPaneURL);
1264 pHelper->RunOnConfigurationEvent(
1265 ::rtl::OUString::createFromAscii("ConfigurationUpdateEnd"),
1266 CurrentPageSetter(mrBase));
1267 }
1268 }
1269 }
1270
1271
1272
1273
ShowViewTabBar(bool bShow)1274 void ViewShellBase::Implementation::ShowViewTabBar (bool bShow)
1275 {
1276 if (mpViewTabBar.is()
1277 && (mpViewTabBar->GetTabControl()->IsVisible()==sal_True) != bShow)
1278 {
1279 mpViewTabBar->GetTabControl()->Show(bShow ? sal_True : sal_False);
1280 mrBase.Rearrange();
1281 }
1282 }
1283
1284
1285
1286
ResizePixel(const Point & rOrigin,const Size & rSize,bool bOuterResize)1287 void ViewShellBase::Implementation::ResizePixel (
1288 const Point& rOrigin,
1289 const Size &rSize,
1290 bool bOuterResize)
1291 {
1292 if (mbIsClosing)
1293 return;
1294
1295 // Forward the call to both the base class and the main stacked sub
1296 // shell only when main sub shell exists.
1297 ViewShell* pMainViewShell = mrBase.GetMainViewShell().get();
1298
1299 // Set the ViewTabBar temporarily to full size so that, when asked
1300 // later, it can return its true height.
1301 mrBase.SetWindow (mpViewWindow.get());
1302 if (mpViewTabBar.is() && mpViewTabBar->GetTabControl()->IsVisible())
1303 mpViewTabBar->GetTabControl()->SetPosSizePixel (rOrigin, rSize);
1304
1305 // Calculate and set the border before the controls are placed.
1306 SvBorder aBorder;
1307 if (pMainViewShell != NULL)
1308 aBorder = pMainViewShell->GetBorder(bOuterResize);
1309 aBorder += mrBase.GetBorder(bOuterResize);
1310 if (mrBase.GetBorderPixel() != aBorder)
1311 mrBase.SetBorderPixel(aBorder);
1312
1313 // Place the ViewTabBar at the top. It is part of the border.
1314 SvBorder aBaseBorder;
1315 if (mpViewTabBar.is() && mpViewTabBar->GetTabControl()->IsVisible())
1316 {
1317 aBaseBorder.Top() = mpViewTabBar->GetHeight();
1318 mpViewTabBar->GetTabControl()->SetPosSizePixel(
1319 rOrigin, Size(rSize.Width(),aBaseBorder.Top()));
1320 }
1321
1322 // The view window gets the remaining space.
1323 Point aViewWindowPosition (
1324 rOrigin.X()+aBaseBorder.Left(),
1325 rOrigin.Y()+aBaseBorder.Top());
1326 Size aViewWindowSize (
1327 rSize.Width() - aBaseBorder.Left() - aBaseBorder.Right(),
1328 rSize.Height() - aBaseBorder.Top() - aBaseBorder.Bottom());
1329 mpViewWindow->SetPosSizePixel(aViewWindowPosition, aViewWindowSize);
1330
1331 maClientArea = Rectangle(Point(0,0), aViewWindowSize);
1332 }
1333
1334
1335
1336
SetPaneVisibility(const SfxRequest & rRequest,const::rtl::OUString & rsPaneURL,const::rtl::OUString & rsViewURL)1337 void ViewShellBase::Implementation::SetPaneVisibility (
1338 const SfxRequest& rRequest,
1339 const ::rtl::OUString& rsPaneURL,
1340 const ::rtl::OUString& rsViewURL)
1341 {
1342 try
1343 {
1344 Reference<XControllerManager> xControllerManager (mrBase.GetController(), UNO_QUERY_THROW);
1345
1346 const Reference< XComponentContext > xContext(
1347 ::comphelper::getProcessComponentContext() );
1348 Reference<XResourceId> xPaneId (ResourceId::create(
1349 xContext, rsPaneURL));
1350 Reference<XResourceId> xViewId (ResourceId::createWithAnchorURL(
1351 xContext, rsViewURL, rsPaneURL));
1352
1353 // Determine the new visibility state.
1354 const SfxItemSet* pArguments = rRequest.GetArgs();
1355 sal_Bool bShowChildWindow;
1356 sal_uInt16 nSlotId = rRequest.GetSlot();
1357 if (pArguments != NULL)
1358 bShowChildWindow = static_cast<const SfxBoolItem&>(
1359 pArguments->Get(nSlotId)).GetValue();
1360 else
1361 {
1362 Reference<XConfigurationController> xConfigurationController (
1363 xControllerManager->getConfigurationController());
1364 if ( ! xConfigurationController.is())
1365 throw RuntimeException();
1366 Reference<XConfiguration> xConfiguration (
1367 xConfigurationController->getRequestedConfiguration());
1368 if ( ! xConfiguration.is())
1369 throw RuntimeException();
1370
1371 bShowChildWindow = ! xConfiguration->hasResource(xPaneId);
1372 }
1373
1374 // Set the desired visibility state at the current configuration
1375 // and update it accordingly.
1376 Reference<XConfigurationController> xConfigurationController (
1377 xControllerManager->getConfigurationController());
1378 if ( ! xConfigurationController.is())
1379 throw RuntimeException();
1380 if (bShowChildWindow)
1381 {
1382 xConfigurationController->requestResourceActivation(
1383 xPaneId,
1384 ResourceActivationMode_ADD);
1385 xConfigurationController->requestResourceActivation(
1386 xViewId,
1387 ResourceActivationMode_REPLACE);
1388 }
1389 else
1390 xConfigurationController->requestResourceDeactivation(
1391 xPaneId);
1392 }
1393 catch (const Exception &)
1394 {
1395 DBG_UNHANDLED_EXCEPTION();
1396 }
1397 }
1398
1399
1400
1401
1402
GetSlotState(SfxItemSet & rSet)1403 void ViewShellBase::Implementation::GetSlotState (SfxItemSet& rSet)
1404 {
1405 try
1406 {
1407 // Get some frequently used values.
1408 Reference<XControllerManager> xControllerManager (mrBase.GetController(), UNO_QUERY_THROW);
1409 Reference<XConfigurationController> xConfigurationController (
1410 xControllerManager->getConfigurationController());
1411 if ( ! xConfigurationController.is())
1412 throw RuntimeException();
1413 Reference<XConfiguration> xConfiguration (
1414 xConfigurationController->getRequestedConfiguration());
1415 if ( ! xConfiguration.is())
1416 throw RuntimeException();
1417
1418 const Reference< XComponentContext > xContext(
1419 ::comphelper::getProcessComponentContext() );
1420 SfxWhichIter aSetIterator (rSet);
1421 sal_uInt16 nItemId (aSetIterator.FirstWhich());
1422 while (nItemId > 0)
1423 {
1424 bool bState (false);
1425 Reference<XResourceId> xResourceId;
1426 try
1427 {
1428 switch (nItemId)
1429 {
1430 case SID_LEFT_PANE_IMPRESS:
1431 xResourceId = ResourceId::create(
1432 xContext, FrameworkHelper::msLeftImpressPaneURL);
1433 break;
1434
1435 case SID_LEFT_PANE_DRAW:
1436 xResourceId = ResourceId::create(
1437 xContext, FrameworkHelper::msLeftDrawPaneURL);
1438 break;
1439
1440 case SID_NORMAL_MULTI_PANE_GUI:
1441 xResourceId = ResourceId::createWithAnchorURL(
1442 xContext,
1443 FrameworkHelper::msImpressViewURL,
1444 FrameworkHelper::msCenterPaneURL);
1445 break;
1446
1447 case SID_SLIDE_SORTER_MULTI_PANE_GUI:
1448 case SID_DIAMODE:
1449 xResourceId = ResourceId::createWithAnchorURL(
1450 xContext,
1451 FrameworkHelper::msSlideSorterURL,
1452 FrameworkHelper::msCenterPaneURL);
1453 break;
1454
1455 case SID_OUTLINEMODE:
1456 xResourceId = ResourceId::createWithAnchorURL(
1457 xContext,
1458 FrameworkHelper::msOutlineViewURL,
1459 FrameworkHelper::msCenterPaneURL);
1460 break;
1461
1462 case SID_HANDOUTMODE:
1463 // There is only the master page mode for the handout
1464 // view so ignore the master page flag.
1465 xResourceId = ResourceId::createWithAnchorURL(
1466 xContext,
1467 FrameworkHelper::msHandoutViewURL,
1468 FrameworkHelper::msCenterPaneURL);
1469 break;
1470
1471 case SID_NOTESMODE:
1472 xResourceId = ResourceId::createWithAnchorURL(
1473 xContext,
1474 FrameworkHelper::msNotesViewURL,
1475 FrameworkHelper::msCenterPaneURL);
1476 break;
1477
1478 default:
1479 // Ignore all other items. They are not meant to be
1480 // handled by us.
1481 break;
1482 }
1483 }
1484 catch (DeploymentException)
1485 {
1486 }
1487
1488 // Determine the state for the resource.
1489 bState = xConfiguration->hasResource(xResourceId);
1490
1491 // Take the master page mode into account.
1492 switch (nItemId)
1493 {
1494 case SID_NORMAL_MULTI_PANE_GUI:
1495 case SID_NOTESMODE:
1496 {
1497 // Determine the master page mode.
1498 ViewShell* pCenterViewShell = FrameworkHelper::Instance(mrBase)->GetViewShell(
1499 FrameworkHelper::msCenterPaneURL).get();
1500 bool bMasterPageMode (false);
1501 if (pCenterViewShell!=NULL && pCenterViewShell->ISA(DrawViewShell))
1502 if (PTR_CAST(DrawViewShell,pCenterViewShell)->GetEditMode()
1503 == EM_MASTERPAGE)
1504 {
1505 bMasterPageMode = true;
1506 }
1507
1508 bState &= !bMasterPageMode;
1509 break;
1510 }
1511
1512 case SID_HANDOUTMODE:
1513 // There is only the master page mode for the handout
1514 // view so ignore the master page flag.
1515 break;
1516 }
1517
1518 // And finally set the state.
1519 rSet.Put(SfxBoolItem(nItemId, bState));
1520
1521 nItemId = aSetIterator.NextWhich();
1522 }
1523 }
1524 catch (RuntimeException&)
1525 {
1526 DBG_UNHANDLED_EXCEPTION();
1527 }
1528
1529 }
1530
1531
1532
1533 } // end of namespace sd
1534
1535
1536
1537
1538 //===== CurrentPageSetter ===========================================
1539
1540 namespace {
1541
CurrentPageSetter(ViewShellBase & rBase)1542 CurrentPageSetter::CurrentPageSetter (ViewShellBase& rBase)
1543 : mrBase(rBase)
1544 {
1545 }
1546
1547
1548
1549
1550
operator ()(bool)1551 void CurrentPageSetter::operator() (bool)
1552 {
1553 FrameView* pFrameView = NULL;
1554
1555 if( bool(mrBase.GetMainViewShell()))
1556 {
1557 pFrameView = mrBase.GetMainViewShell()->GetFrameView();
1558 }
1559
1560 if (pFrameView!=NULL)
1561 {
1562 try
1563 {
1564 // Get the current page either from the DrawPagesSupplier or the
1565 // MasterPagesSupplier.
1566 Any aPage;
1567 if (pFrameView->GetViewShEditModeOnLoad() == EM_PAGE)
1568 {
1569 Reference<drawing::XDrawPagesSupplier> xPagesSupplier (
1570 mrBase.GetController()->getModel(), UNO_QUERY_THROW);
1571 Reference<container::XIndexAccess> xPages (
1572 xPagesSupplier->getDrawPages(), UNO_QUERY_THROW);
1573 aPage = xPages->getByIndex(pFrameView->GetSelectedPageOnLoad());
1574 }
1575 else
1576 {
1577 Reference<drawing::XMasterPagesSupplier> xPagesSupplier (
1578 mrBase.GetController()->getModel(), UNO_QUERY_THROW);
1579 Reference<container::XIndexAccess> xPages (
1580 xPagesSupplier->getMasterPages(), UNO_QUERY_THROW);
1581 aPage = xPages->getByIndex(pFrameView->GetSelectedPageOnLoad());
1582 }
1583 // Switch to the page last edited by setting the CurrentPage
1584 // property.
1585 Reference<beans::XPropertySet> xSet (mrBase.GetController(), UNO_QUERY_THROW);
1586 xSet->setPropertyValue (String::CreateFromAscii("CurrentPage"), aPage);
1587 }
1588 catch (RuntimeException aException)
1589 {
1590 // We have not been able to set the current page at the main view.
1591 // This is sad but still leaves us in a valid state. Therefore,
1592 // this exception is silently ignored.
1593 }
1594 catch (beans::UnknownPropertyException aException)
1595 {
1596 DBG_ASSERT(false,"CurrentPage property unknown");
1597 }
1598 }
1599 }
1600
1601 } // end of anonymouse namespace
1602
1603
1604
1605
1606 //===== FocusForwardingWindow =================================================
1607
1608 namespace sd { namespace {
1609
FocusForwardingWindow(::Window & rParentWindow,ViewShellBase & rBase)1610 FocusForwardingWindow::FocusForwardingWindow (
1611 ::Window& rParentWindow,
1612 ViewShellBase& rBase)
1613 : ::Window(&rParentWindow, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
1614 mrBase(rBase)
1615 {
1616 OSL_TRACE("created FocusForwardingWindow at %x", this);
1617 }
1618
1619
1620
1621
~FocusForwardingWindow(void)1622 FocusForwardingWindow::~FocusForwardingWindow (void)
1623 {
1624 OSL_TRACE("destroyed FocusForwardingWindow at %x", this);
1625 }
1626
1627
1628
1629
KeyInput(const KeyEvent & rKEvt)1630 void FocusForwardingWindow::KeyInput (const KeyEvent& rKEvt)
1631 {
1632 ::boost::shared_ptr<ViewShell> pViewShell = mrBase.GetMainViewShell();
1633 if (pViewShell.get() != NULL)
1634 {
1635 ::Window* pWindow = pViewShell->GetActiveWindow();
1636 if (pWindow != NULL)
1637 {
1638 // Forward the focus so that the window is called directly the
1639 // next time.
1640 pWindow->GrabFocus();
1641 // Forward the key press as well.
1642 pWindow->KeyInput(rKEvt);
1643 }
1644 }
1645 }
1646
1647
1648
1649
Command(const CommandEvent & rEvent)1650 void FocusForwardingWindow::Command (const CommandEvent& rEvent)
1651 {
1652 ::boost::shared_ptr<ViewShell> pViewShell = mrBase.GetMainViewShell();
1653 if (pViewShell.get() != NULL)
1654 {
1655 ::Window* pWindow = pViewShell->GetActiveWindow();
1656 if (pWindow != NULL)
1657 {
1658 pWindow->Command(rEvent);
1659 }
1660 }
1661 }
1662
1663
1664 } // end of anonymouse namespace
1665
1666 } // end of namespace sd
1667