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