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