1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #include "precompiled_sd.hxx" 29 30 #include <com/sun/star/presentation/XPresentation2.hpp> 31 32 #include <editeng/outlobj.hxx> 33 34 #include "controller/SlsSlotManager.hxx" 35 #include "SlideSorter.hxx" 36 #include "SlideSorterViewShell.hxx" 37 #include "controller/SlideSorterController.hxx" 38 #include "controller/SlsClipboard.hxx" 39 #include "controller/SlsCurrentSlideManager.hxx" 40 #include "controller/SlsFocusManager.hxx" 41 #include "controller/SlsInsertionIndicatorHandler.hxx" 42 #include "controller/SlsPageSelector.hxx" 43 #include "controller/SlsSelectionFunction.hxx" 44 #include "controller/SlsSelectionManager.hxx" 45 #include "controller/SlsSelectionObserver.hxx" 46 #include "SlsCommand.hxx" 47 #include "model/SlideSorterModel.hxx" 48 #include "model/SlsPageEnumerationProvider.hxx" 49 #include "model/SlsPageDescriptor.hxx" 50 #include "view/SlideSorterView.hxx" 51 #include "view/SlsLayouter.hxx" 52 #include "framework/FrameworkHelper.hxx" 53 #include "Window.hxx" 54 #include "fupoor.hxx" 55 #include "fuzoom.hxx" 56 #include "fucushow.hxx" 57 #include "fusldlg.hxx" 58 #include "fuexpand.hxx" 59 #include "fusumry.hxx" 60 #include "fuscale.hxx" 61 #include "slideshow.hxx" 62 #include "app.hrc" 63 #include "strings.hrc" 64 #include "sdresid.hxx" 65 #include "drawdoc.hxx" 66 #include "DrawDocShell.hxx" 67 #include "ViewShellBase.hxx" 68 #include "ViewShellImplementation.hxx" 69 #include "sdattr.hxx" 70 #include "FrameView.hxx" 71 #include "zoomlist.hxx" 72 #include "sdpage.hxx" 73 #include "sdxfer.hxx" 74 #include "helpids.h" 75 #include "glob.hrc" 76 #include "unmodpg.hxx" 77 #include "DrawViewShell.hxx" 78 79 #include <sfx2/request.hxx> 80 #include <sfx2/viewfrm.hxx> 81 #include <sfx2/bindings.hxx> 82 #include <sfx2/dispatch.hxx> 83 #include <svx/svxids.hrc> 84 #include <svx/zoomitem.hxx> 85 #include <svx/svxdlg.hxx> 86 #include <svx/dialogs.hrc> 87 #include <vcl/msgbox.hxx> 88 #include <svl/intitem.hxx> 89 #include <svl/whiter.hxx> 90 #include <svl/itempool.hxx> 91 #include <svl/aeitem.hxx> 92 #include <com/sun/star/presentation/FadeEffect.hpp> 93 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp> 94 #include <com/sun/star/drawing/XDrawPages.hpp> 95 #include <vcl/svapp.hxx> 96 97 #include <boost/bind.hpp> 98 99 using namespace ::com::sun::star; 100 using namespace ::com::sun::star::uno; 101 using namespace ::com::sun::star::presentation; 102 103 namespace sd { namespace slidesorter { namespace controller { 104 105 namespace { 106 107 /** The state of a set of slides with respect to being excluded from the 108 slide show. 109 */ 110 enum SlideExclusionState {UNDEFINED, EXCLUDED, INCLUDED, MIXED}; 111 112 /** Return for the given set of slides whether they included are 113 excluded from the slide show. 114 */ 115 SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet); 116 117 } // end of anonymous namespace 118 119 120 121 SlotManager::SlotManager (SlideSorter& rSlideSorter) 122 : mrSlideSorter(rSlideSorter), 123 maCommandQueue() 124 { 125 } 126 127 128 129 130 SlotManager::~SlotManager (void) 131 { 132 } 133 134 135 136 137 void SlotManager::FuTemporary (SfxRequest& rRequest) 138 { 139 SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); 140 141 SlideSorterViewShell* pShell 142 = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell()); 143 if (pShell == NULL) 144 return; 145 146 switch (rRequest.GetSlot()) 147 { 148 case SID_PRESENTATION: 149 case SID_REHEARSE_TIMINGS: 150 ShowSlideShow (rRequest); 151 pShell->Cancel(); 152 rRequest.Done(); 153 break; 154 155 case SID_HIDE_SLIDE: 156 ChangeSlideExclusionState(model::SharedPageDescriptor(), true); 157 break; 158 159 case SID_SHOW_SLIDE: 160 ChangeSlideExclusionState(model::SharedPageDescriptor(), false); 161 break; 162 163 case SID_PAGES_PER_ROW: 164 if (rRequest.GetArgs() != NULL) 165 { 166 SFX_REQUEST_ARG(rRequest, pPagesPerRow, SfxUInt16Item, 167 SID_PAGES_PER_ROW, sal_False); 168 if (pPagesPerRow != NULL) 169 { 170 sal_Int32 nColumnCount = pPagesPerRow->GetValue(); 171 // Force the given number of columns by setting 172 // the minimal and maximal number of columns to 173 // the same value. 174 mrSlideSorter.GetView().GetLayouter().SetColumnCount ( 175 nColumnCount, nColumnCount); 176 // Force a repaint and re-layout. 177 pShell->ArrangeGUIElements (); 178 // Rearrange the UI-elements controlled by the 179 // controller and force a rearrangement of the 180 // view. 181 mrSlideSorter.GetController().Rearrange(true); 182 } 183 } 184 rRequest.Done(); 185 break; 186 187 case SID_SELECTALL: 188 mrSlideSorter.GetController().GetPageSelector().SelectAllPages(); 189 rRequest.Done(); 190 break; 191 192 case SID_SLIDE_TRANSITIONS_PANEL: 193 { 194 // Make the slide transition panel visible (expand it) 195 // in the tool pane. 196 if (mrSlideSorter.GetViewShellBase() != NULL) 197 framework::FrameworkHelper::Instance(*mrSlideSorter.GetViewShellBase()) 198 ->RequestTaskPanel(sd::framework::FrameworkHelper::msSlideTransitionTaskPanelURL); 199 rRequest.Ignore (); 200 break; 201 } 202 203 case SID_PRESENTATION_DLG: 204 FuSlideShowDlg::Create ( 205 pShell, 206 mrSlideSorter.GetContentWindow().get(), 207 &mrSlideSorter.GetView(), 208 pDocument, 209 rRequest); 210 break; 211 212 case SID_CUSTOMSHOW_DLG: 213 FuCustomShowDlg::Create ( 214 pShell, 215 mrSlideSorter.GetContentWindow().get(), 216 &mrSlideSorter.GetView(), 217 pDocument, 218 rRequest); 219 break; 220 221 case SID_EXPAND_PAGE: 222 FuExpandPage::Create ( 223 pShell, 224 mrSlideSorter.GetContentWindow().get(), 225 &mrSlideSorter.GetView(), 226 pDocument, 227 rRequest); 228 break; 229 230 case SID_SUMMARY_PAGE: 231 FuSummaryPage::Create ( 232 pShell, 233 mrSlideSorter.GetContentWindow().get(), 234 &mrSlideSorter.GetView(), 235 pDocument, 236 rRequest); 237 break; 238 239 case SID_INSERTPAGE: 240 case SID_INSERT_MASTER_PAGE: 241 InsertSlide(rRequest); 242 rRequest.Done(); 243 break; 244 245 case SID_DUPLICATE_PAGE: 246 DuplicateSelectedSlides(rRequest); 247 rRequest.Done(); 248 break; 249 250 case SID_DELETE_PAGE: 251 case SID_DELETE_MASTER_PAGE: 252 case SID_DELETE: // we need SID_CUT to handle the delete key 253 // (DEL -> accelerator -> SID_CUT). 254 if (mrSlideSorter.GetModel().GetPageCount() > 1) 255 { 256 mrSlideSorter.GetController().GetSelectionManager()->DeleteSelectedPages(); 257 } 258 259 rRequest.Done(); 260 break; 261 262 case SID_RENAMEPAGE: 263 case SID_RENAME_MASTER_PAGE: 264 RenameSlide (); 265 rRequest.Done (); 266 break; 267 268 case SID_ASSIGN_LAYOUT: 269 { 270 pShell->mpImpl->AssignLayout( rRequest, mrSlideSorter.GetModel().GetPageType() ); 271 rRequest.Done (); 272 } 273 break; 274 275 default: 276 break; 277 } 278 } 279 280 281 282 283 void SlotManager::FuPermanent (SfxRequest& rRequest) 284 { 285 ViewShell* pShell = mrSlideSorter.GetViewShell(); 286 if (pShell == NULL) 287 return; 288 289 if(pShell->GetCurrentFunction().is()) 290 { 291 FunctionReference xEmpty; 292 if (pShell->GetOldFunction() == pShell->GetCurrentFunction()) 293 pShell->SetOldFunction(xEmpty); 294 295 pShell->GetCurrentFunction()->Deactivate(); 296 pShell->SetCurrentFunction(xEmpty); 297 } 298 299 switch(rRequest.GetSlot()) 300 { 301 case SID_OBJECT_SELECT: 302 pShell->SetCurrentFunction( SelectionFunction::Create(mrSlideSorter, rRequest) ); 303 rRequest.Done(); 304 break; 305 306 default: 307 break; 308 } 309 310 if(pShell->GetOldFunction().is()) 311 { 312 pShell->GetOldFunction()->Deactivate(); 313 FunctionReference xEmpty; 314 pShell->SetOldFunction(xEmpty); 315 } 316 317 if(pShell->GetCurrentFunction().is()) 318 { 319 pShell->GetCurrentFunction()->Activate(); 320 pShell->SetOldFunction(pShell->GetCurrentFunction()); 321 } 322 323 //! das ist nur bis das ENUM-Slots sind 324 // Invalidate( SID_OBJECT_SELECT ); 325 } 326 327 void SlotManager::FuSupport (SfxRequest& rRequest) 328 { 329 switch (rRequest.GetSlot()) 330 { 331 case SID_STYLE_FAMILY: 332 if (rRequest.GetArgs() != NULL) 333 { 334 SdDrawDocument* pDocument 335 = mrSlideSorter.GetModel().GetDocument(); 336 if (pDocument != NULL) 337 { 338 const SfxPoolItem& rItem ( 339 rRequest.GetArgs()->Get(SID_STYLE_FAMILY)); 340 pDocument->GetDocSh()->SetStyleFamily( 341 static_cast<const SfxUInt16Item&>(rItem).GetValue()); 342 } 343 } 344 break; 345 346 case SID_PASTE: 347 { 348 SdTransferable* pTransferClip = SD_MOD()->pTransferClip; 349 if( pTransferClip ) 350 { 351 SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell(); 352 353 DrawDocShell* pDocShell = dynamic_cast<DrawDocShell*>(pTransferDocShell); 354 if (pDocShell && pDocShell->GetDoc()->GetPageCount() > 1) 355 { 356 mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest); 357 break; 358 } 359 } 360 ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); 361 if (pBase != NULL) 362 { 363 ::boost::shared_ptr<DrawViewShell> pDrawViewShell ( 364 ::boost::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell())); 365 if (pDrawViewShell.get() != NULL) 366 pDrawViewShell->FuSupport(rRequest); 367 } 368 } 369 break; 370 371 case SID_CUT: 372 case SID_COPY: 373 case SID_DELETE: 374 mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest); 375 break; 376 377 case SID_DRAWINGMODE: 378 case SID_NOTESMODE: 379 case SID_HANDOUTMODE: 380 case SID_DIAMODE: 381 case SID_OUTLINEMODE: 382 { 383 ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); 384 if (pBase != NULL) 385 { 386 framework::FrameworkHelper::Instance(*pBase)->HandleModeChangeSlot( 387 rRequest.GetSlot(), rRequest); 388 rRequest.Done(); 389 } 390 break; 391 } 392 393 case SID_UNDO: 394 { 395 SlideSorterViewShell* pViewShell 396 = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell()); 397 if (pViewShell != NULL) 398 { 399 view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); 400 SlideSorterController::ModelChangeLock aModelLock (mrSlideSorter.GetController()); 401 PageSelector::UpdateLock aUpdateLock (mrSlideSorter); 402 SelectionObserver::Context aContext (mrSlideSorter); 403 pViewShell->ImpSidUndo (sal_False, rRequest); 404 } 405 break; 406 } 407 408 case SID_REDO: 409 { 410 SlideSorterViewShell* pViewShell 411 = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell()); 412 if (pViewShell != NULL) 413 { 414 view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); 415 SlideSorterController::ModelChangeLock aModelLock (mrSlideSorter.GetController()); 416 PageSelector::UpdateLock aUpdateLock (mrSlideSorter); 417 SelectionObserver::Context aContext (mrSlideSorter); 418 pViewShell->ImpSidRedo (sal_False, rRequest); 419 } 420 break; 421 } 422 423 default: 424 break; 425 } 426 } 427 428 429 430 431 void SlotManager::ExecCtrl (SfxRequest& rRequest) 432 { 433 ViewShell* pViewShell = mrSlideSorter.GetViewShell(); 434 sal_uInt16 nSlot = rRequest.GetSlot(); 435 switch (nSlot) 436 { 437 case SID_RELOAD: 438 { 439 // Undo-Manager leeren 440 mrSlideSorter.GetModel().GetDocument()->GetDocSh()->ClearUndoBuffer(); 441 442 // Normale Weiterleitung an ViewFrame zur Ausfuehrung 443 if (pViewShell != NULL) 444 pViewShell->GetViewFrame()->ExecuteSlot(rRequest); 445 446 // Muss sofort beendet werden 447 return; 448 } 449 450 case SID_OUTPUT_QUALITY_COLOR: 451 case SID_OUTPUT_QUALITY_GRAYSCALE: 452 case SID_OUTPUT_QUALITY_BLACKWHITE: 453 case SID_OUTPUT_QUALITY_CONTRAST: 454 { 455 // flush page cache 456 if (pViewShell != NULL) 457 pViewShell->ExecReq (rRequest); 458 break; 459 } 460 461 case SID_MAIL_SCROLLBODY_PAGEDOWN: 462 { 463 if (pViewShell != NULL) 464 pViewShell->ExecReq (rRequest); 465 break; 466 } 467 468 case SID_OPT_LOCALE_CHANGED: 469 { 470 mrSlideSorter.GetController().UpdateAllPages(); 471 if (pViewShell != NULL) 472 pViewShell->UpdatePreview (pViewShell->GetActualPage()); 473 rRequest.Done(); 474 break; 475 } 476 477 case SID_SEARCH_DLG: 478 // We have to handle the SID_SEARCH_DLG slot explicitly because 479 // in some cases (when the slide sorter is displayed in the 480 // center pane) we want to disable the search dialog. Therefore 481 // we have to handle the execution of that slot as well. 482 // We try to do that by forwarding the request to the view frame 483 // of the view shell. 484 if (pViewShell != NULL) 485 pViewShell->GetViewFrame()->ExecuteSlot(rRequest); 486 break; 487 488 default: 489 break; 490 } 491 } 492 493 494 495 496 void SlotManager::GetAttrState (SfxItemSet& rSet) 497 { 498 // Iteratate over all items. 499 SfxWhichIter aIter (rSet); 500 sal_uInt16 nWhich = aIter.FirstWhich(); 501 while (nWhich) 502 { 503 sal_uInt16 nSlotId (nWhich); 504 if (SfxItemPool::IsWhich(nWhich) && mrSlideSorter.GetViewShell()!=NULL) 505 nSlotId = mrSlideSorter.GetViewShell()->GetPool().GetSlotId(nWhich); 506 switch (nSlotId) 507 { 508 case SID_PAGES_PER_ROW: 509 rSet.Put ( 510 SfxUInt16Item ( 511 nSlotId, 512 (sal_uInt16)mrSlideSorter.GetView().GetLayouter().GetColumnCount() 513 ) 514 ); 515 break; 516 } 517 nWhich = aIter.NextWhich(); 518 } 519 } 520 521 void SlotManager::GetMenuState (SfxItemSet& rSet) 522 { 523 EditMode eEditMode = mrSlideSorter.GetModel().GetEditMode(); 524 ViewShell* pShell = mrSlideSorter.GetViewShell(); 525 DrawDocShell* pDocShell = mrSlideSorter.GetModel().GetDocument()->GetDocSh(); 526 527 if (pShell!=NULL && pShell->GetCurrentFunction().is()) 528 { 529 sal_uInt16 nSId = pShell->GetCurrentFunction()->GetSlotID(); 530 531 rSet.Put( SfxBoolItem( nSId, sal_True ) ); 532 } 533 rSet.Put( SfxBoolItem( SID_DRAWINGMODE, sal_False ) ); 534 rSet.Put( SfxBoolItem( SID_DIAMODE, sal_True ) ); 535 rSet.Put( SfxBoolItem( SID_OUTLINEMODE, sal_False ) ); 536 rSet.Put( SfxBoolItem( SID_NOTESMODE, sal_False ) ); 537 rSet.Put( SfxBoolItem( SID_HANDOUTMODE, sal_False ) ); 538 539 // Vorlagenkatalog darf nicht aufgerufen werden 540 rSet.DisableItem(SID_STYLE_CATALOG); 541 542 if (pShell!=NULL && pShell->IsMainViewShell()) 543 { 544 rSet.DisableItem(SID_SPELL_DIALOG); 545 rSet.DisableItem(SID_SEARCH_DLG); 546 } 547 548 if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_EXPAND_PAGE)) 549 { 550 bool bDisable = true; 551 if (eEditMode == EM_PAGE) 552 { 553 // At least one of the selected pages has to contain an outline 554 // presentation objects in order to enable the expand page menu 555 // entry. 556 model::PageEnumeration aSelectedPages ( 557 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 558 mrSlideSorter.GetModel())); 559 while (aSelectedPages.HasMoreElements()) 560 { 561 SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); 562 SdrObject* pObj = pPage->GetPresObj(PRESOBJ_OUTLINE); 563 if (pObj!=NULL ) 564 { 565 if( !pObj->IsEmptyPresObj() ) 566 { 567 bDisable = false; 568 } 569 else 570 { 571 // check if the object is in edit, than its temporarely not empty 572 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj ); 573 if( pTextObj ) 574 { 575 OutlinerParaObject* pParaObj = pTextObj->GetEditOutlinerParaObject(); 576 if( pParaObj ) 577 { 578 delete pParaObj; 579 bDisable = false; 580 } 581 } 582 } 583 } 584 } 585 } 586 587 if (bDisable) 588 rSet.DisableItem (SID_EXPAND_PAGE); 589 } 590 591 if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_SUMMARY_PAGE)) 592 { 593 bool bDisable = true; 594 if (eEditMode == EM_PAGE) 595 { 596 // At least one of the selected pages has to contain a title 597 // presentation objects in order to enable the summary page menu 598 // entry. 599 model::PageEnumeration aSelectedPages ( 600 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 601 mrSlideSorter.GetModel())); 602 while (aSelectedPages.HasMoreElements()) 603 { 604 SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); 605 SdrObject* pObj = pPage->GetPresObj(PRESOBJ_TITLE); 606 607 if (pObj!=NULL && !pObj->IsEmptyPresObj()) 608 bDisable = false; 609 } 610 } 611 if (bDisable) 612 rSet.DisableItem (SID_SUMMARY_PAGE); 613 } 614 615 // Starten der Praesentation moeglich? 616 if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_PRESENTATION ) || 617 SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_REHEARSE_TIMINGS ) ) 618 { 619 sal_Bool bDisable = sal_True; 620 model::PageEnumeration aAllPages ( 621 model::PageEnumerationProvider::CreateAllPagesEnumeration(mrSlideSorter.GetModel())); 622 while (aAllPages.HasMoreElements()) 623 { 624 SdPage* pPage = aAllPages.GetNextElement()->GetPage(); 625 626 if( !pPage->IsExcluded() ) 627 bDisable = sal_False; 628 } 629 if( bDisable || pDocShell->IsPreview()) 630 { 631 rSet.DisableItem( SID_PRESENTATION ); 632 rSet.DisableItem( SID_REHEARSE_TIMINGS ); 633 } 634 } 635 636 637 // Disable the rename slots when there are no or more than one slides/master 638 // pages selected. 639 if (rSet.GetItemState(SID_RENAMEPAGE) == SFX_ITEM_AVAILABLE 640 || rSet.GetItemState(SID_RENAME_MASTER_PAGE) == SFX_ITEM_AVAILABLE) 641 { 642 if (mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount() != 1) 643 { 644 rSet.DisableItem(SID_RENAMEPAGE); 645 rSet.DisableItem(SID_RENAME_MASTER_PAGE); 646 } 647 } 648 649 if (rSet.GetItemState(SID_HIDE_SLIDE) == SFX_ITEM_AVAILABLE 650 || rSet.GetItemState(SID_SHOW_SLIDE) == SFX_ITEM_AVAILABLE) 651 { 652 model::PageEnumeration aSelectedPages ( 653 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 654 mrSlideSorter.GetModel())); 655 const SlideExclusionState eState (GetSlideExclusionState(aSelectedPages)); 656 switch (eState) 657 { 658 case MIXED: 659 // Show both entries. 660 break; 661 662 case EXCLUDED: 663 rSet.DisableItem(SID_HIDE_SLIDE); 664 break; 665 666 case INCLUDED: 667 rSet.DisableItem(SID_SHOW_SLIDE); 668 break; 669 670 case UNDEFINED: 671 rSet.DisableItem(SID_HIDE_SLIDE); 672 rSet.DisableItem(SID_SHOW_SLIDE); 673 break; 674 } 675 } 676 677 678 PageKind ePageKind = mrSlideSorter.GetModel().GetPageType(); 679 if ((eEditMode == EM_MASTERPAGE) && (ePageKind != PK_HANDOUT)) 680 { 681 rSet.DisableItem(SID_ASSIGN_LAYOUT); 682 } 683 684 if ((eEditMode == EM_MASTERPAGE) || (ePageKind==PK_NOTES)) 685 { 686 rSet.DisableItem(SID_INSERTPAGE); 687 } 688 689 // Disable some slots when in master page mode. 690 if (eEditMode == EM_MASTERPAGE) 691 { 692 if (rSet.GetItemState(SID_INSERTPAGE) == SFX_ITEM_AVAILABLE) 693 rSet.DisableItem(SID_INSERTPAGE); 694 if (rSet.GetItemState(SID_DUPLICATE_PAGE) == SFX_ITEM_AVAILABLE) 695 rSet.DisableItem(SID_DUPLICATE_PAGE); 696 } 697 } 698 699 700 701 702 void SlotManager::GetClipboardState ( SfxItemSet& rSet) 703 { 704 SdTransferable* pTransferClip = SD_MOD()->pTransferClip; 705 706 if (rSet.GetItemState(SID_PASTE) == SFX_ITEM_AVAILABLE 707 || rSet.GetItemState(SID_PASTE_SPECIAL) == SFX_ITEM_AVAILABLE) 708 { 709 // Keine eigenen Clipboard-Daten? 710 if ( !pTransferClip || !pTransferClip->GetDocShell() ) 711 { 712 rSet.DisableItem(SID_PASTE); 713 rSet.DisableItem(SID_PASTE_SPECIAL); 714 } 715 else 716 { 717 SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell(); 718 719 if( !pTransferDocShell || ( (DrawDocShell*) pTransferDocShell)->GetDoc()->GetPageCount() <= 1 ) 720 { 721 bool bIsPastingSupported (false); 722 723 // No or just one page. Check if there is anything that can be 724 // pasted via a DrawViewShell. 725 ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); 726 if (pBase != NULL) 727 { 728 ::boost::shared_ptr<DrawViewShell> pDrawViewShell ( 729 ::boost::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell())); 730 if (pDrawViewShell.get() != NULL) 731 { 732 TransferableDataHelper aDataHelper ( 733 TransferableDataHelper::CreateFromSystemClipboard( 734 pDrawViewShell->GetActiveWindow())); 735 if (aDataHelper.GetFormatCount() > 0) 736 bIsPastingSupported = true; 737 } 738 } 739 740 if ( ! bIsPastingSupported) 741 { 742 rSet.DisableItem(SID_PASTE); 743 rSet.DisableItem(SID_PASTE_SPECIAL); 744 } 745 } 746 } 747 } 748 749 // Cut, copy and paste of master pages is not yet implemented properly 750 if (rSet.GetItemState(SID_COPY) == SFX_ITEM_AVAILABLE 751 || rSet.GetItemState(SID_PASTE) == SFX_ITEM_AVAILABLE 752 || rSet.GetItemState(SID_PASTE_SPECIAL) == SFX_ITEM_AVAILABLE 753 || rSet.GetItemState(SID_CUT) == SFX_ITEM_AVAILABLE) 754 { 755 if (mrSlideSorter.GetModel().GetEditMode() == EM_MASTERPAGE) 756 { 757 if (rSet.GetItemState(SID_CUT) == SFX_ITEM_AVAILABLE) 758 rSet.DisableItem(SID_CUT); 759 if (rSet.GetItemState(SID_COPY) == SFX_ITEM_AVAILABLE) 760 rSet.DisableItem(SID_COPY); 761 if (rSet.GetItemState(SID_PASTE) == SFX_ITEM_AVAILABLE) 762 rSet.DisableItem(SID_PASTE); 763 if (rSet.GetItemState(SID_PASTE_SPECIAL) == SFX_ITEM_AVAILABLE) 764 rSet.DisableItem(SID_PASTE_SPECIAL); 765 } 766 } 767 768 // Cut, copy, and delete page are disabled when there is no selection. 769 if (rSet.GetItemState(SID_CUT) == SFX_ITEM_AVAILABLE 770 || rSet.GetItemState(SID_COPY) == SFX_ITEM_AVAILABLE 771 || rSet.GetItemState(SID_DELETE) == SFX_ITEM_AVAILABLE 772 || rSet.GetItemState(SID_DELETE_PAGE) == SFX_ITEM_AVAILABLE 773 || rSet.GetItemState(SID_DELETE_MASTER_PAGE) == SFX_ITEM_AVAILABLE) 774 { 775 model::PageEnumeration aSelectedPages ( 776 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 777 mrSlideSorter.GetModel())); 778 779 // For copy to work we have to have at least one selected page. 780 if ( ! aSelectedPages.HasMoreElements()) 781 rSet.DisableItem(SID_COPY); 782 783 bool bDisable = false; 784 // The operations that lead to the deletion of a page are valid if 785 // a) there is at least one selected page 786 // b) deleting the selected pages leaves at least one page in the 787 // document 788 // c) selected master pages must not be used by slides. 789 790 // Test a). 791 if ( ! aSelectedPages.HasMoreElements()) 792 bDisable = true; 793 // Test b): Count the number of selected pages. It has to be less 794 // than the number of all pages. 795 else if (mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount() 796 >= mrSlideSorter.GetController().GetPageSelector().GetPageCount()) 797 bDisable = true; 798 // Test c): Iterate over the selected pages and look for a master 799 // page that is used by at least one page. 800 else while (aSelectedPages.HasMoreElements()) 801 { 802 SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); 803 int nUseCount (mrSlideSorter.GetModel().GetDocument() 804 ->GetMasterPageUserCount(pPage)); 805 if (nUseCount > 0) 806 { 807 bDisable = true; 808 break; 809 } 810 } 811 812 if (bDisable) 813 { 814 rSet.DisableItem(SID_CUT); 815 rSet.DisableItem(SID_DELETE_PAGE); 816 rSet.DisableItem(SID_DELETE_MASTER_PAGE); 817 } 818 } 819 } 820 821 822 823 824 void SlotManager::GetStatusBarState (SfxItemSet& rSet) 825 { 826 // Seitenanzeige und Layout 827 /* 828 if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_PAGE ) || 829 SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_LAYOUT ) ) 830 */ 831 SdPage* pPage = NULL; 832 SdPage* pFirstPage = NULL; 833 sal_uInt16 nFirstPage; 834 sal_uInt16 nSelectedPages = (sal_uInt16)mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount(); 835 String aPageStr; 836 String aLayoutStr; 837 838 if (nSelectedPages > 0) 839 aPageStr = String(SdResId(STR_SD_PAGE)); 840 841 if (nSelectedPages == 1) 842 { 843 model::PageEnumeration aSelectedPages ( 844 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 845 mrSlideSorter.GetModel())); 846 model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); 847 if (pDescriptor) 848 { 849 pPage = pDescriptor->GetPage(); 850 nFirstPage = pPage->GetPageNum()/2; 851 pFirstPage = pPage; 852 853 aPageStr += sal_Unicode(' '); 854 aPageStr += String::CreateFromInt32( nFirstPage + 1 ); 855 aPageStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " )); 856 aPageStr += String::CreateFromInt32( 857 mrSlideSorter.GetModel().GetPageCount()); 858 859 aLayoutStr = pFirstPage->GetLayoutName(); 860 aLayoutStr.Erase( aLayoutStr.SearchAscii( SD_LT_SEPARATOR ) ); 861 } 862 } 863 864 rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) ); 865 rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) ); 866 867 if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) ) 868 { 869 rSet.Put( SfxVoidItem( SID_ATTR_ZOOMSLIDER ) ); 870 } 871 } 872 873 void SlotManager::ShowSlideShow( SfxRequest& rReq) 874 { 875 Reference< XPresentation2 > xPresentation( mrSlideSorter.GetModel().GetDocument()->getPresentation() ); 876 if( xPresentation.is() ) 877 { 878 if( ( SID_REHEARSE_TIMINGS != rReq.GetSlot() ) ) 879 xPresentation->start(); 880 else 881 xPresentation->rehearseTimings(); 882 } 883 } 884 885 void SlotManager::RenameSlide (void) 886 { 887 PageKind ePageKind = mrSlideSorter.GetModel().GetPageType(); 888 View* pDrView = &mrSlideSorter.GetView(); 889 890 if (ePageKind==PK_STANDARD || ePageKind==PK_NOTES) 891 { 892 if ( pDrView->IsTextEdit() ) 893 { 894 pDrView->SdrEndTextEdit(); 895 } 896 897 SdPage* pSelectedPage = NULL; 898 model::PageEnumeration aSelectedPages ( 899 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 900 mrSlideSorter.GetModel())); 901 if (aSelectedPages.HasMoreElements()) 902 pSelectedPage = aSelectedPages.GetNextElement()->GetPage(); 903 if (pSelectedPage != NULL) 904 { 905 String aTitle( SdResId( STR_TITLE_RENAMESLIDE ) ); 906 String aDescr( SdResId( STR_DESC_RENAMESLIDE ) ); 907 String aPageName = pSelectedPage->GetName(); 908 909 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 910 DBG_ASSERT(pFact, "Dialogdiet fail!"); 911 AbstractSvxNameDialog* aNameDlg = pFact->CreateSvxNameDialog( 912 mrSlideSorter.GetContentWindow().get(), 913 aPageName, aDescr); 914 DBG_ASSERT(aNameDlg, "Dialogdiet fail!"); 915 aNameDlg->SetText( aTitle ); 916 aNameDlg->SetCheckNameHdl( LINK( this, SlotManager, RenameSlideHdl ), true ); 917 aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE ); 918 919 if( aNameDlg->Execute() == RET_OK ) 920 { 921 String aNewName; 922 aNameDlg->GetName( aNewName ); 923 if( ! aNewName.Equals( aPageName ) ) 924 { 925 #ifdef DBG_UTIL 926 bool bResult = 927 #endif 928 RenameSlideFromDrawViewShell( 929 pSelectedPage->GetPageNum()/2, aNewName ); 930 DBG_ASSERT( bResult, "Couldn't rename slide" ); 931 } 932 } 933 delete aNameDlg; 934 935 // Tell the slide sorter about the name change (necessary for 936 // accessibility.) 937 mrSlideSorter.GetController().PageNameHasChanged( 938 (pSelectedPage->GetPageNum()-1)/2, aPageName); 939 } 940 } 941 } 942 943 IMPL_LINK(SlotManager, RenameSlideHdl, AbstractSvxNameDialog*, pDialog) 944 { 945 if( ! pDialog ) 946 return 0; 947 948 String aNewName; 949 pDialog->GetName( aNewName ); 950 951 model::SharedPageDescriptor pDescriptor ( 952 mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); 953 SdPage* pCurrentPage = NULL; 954 if (pDescriptor.get() != NULL) 955 pCurrentPage = pDescriptor->GetPage(); 956 957 return ( (pCurrentPage!=NULL && aNewName.Equals( pCurrentPage->GetName() )) 958 || (mrSlideSorter.GetViewShell() 959 && mrSlideSorter.GetViewShell()->GetDocSh()->IsNewPageNameValid( aNewName ) )); 960 } 961 962 bool SlotManager::RenameSlideFromDrawViewShell( sal_uInt16 nPageId, const String & rName ) 963 { 964 sal_Bool bOutDummy; 965 SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); 966 if( pDocument->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND ) 967 return false; 968 969 SdPage* pPageToRename = NULL; 970 PageKind ePageKind = mrSlideSorter.GetModel().GetPageType(); 971 972 ::svl::IUndoManager* pManager = pDocument->GetDocSh()->GetUndoManager(); 973 974 if( mrSlideSorter.GetModel().GetEditMode() == EM_PAGE ) 975 { 976 model::SharedPageDescriptor pDescriptor ( 977 mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); 978 if (pDescriptor.get() != NULL) 979 pPageToRename = pDescriptor->GetPage(); 980 981 if (pPageToRename != NULL) 982 { 983 // Undo 984 SdPage* pUndoPage = pPageToRename; 985 SdrLayerAdmin & rLayerAdmin = pDocument->GetLayerAdmin(); 986 sal_uInt8 nBackground = rLayerAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRND )), sal_False ); 987 sal_uInt8 nBgObj = rLayerAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRNDOBJ )), sal_False ); 988 SetOfByte aVisibleLayers = pPageToRename->TRG_GetMasterPageVisibleLayers(); 989 990 // (#67720#) 991 ModifyPageUndoAction* pAction = new ModifyPageUndoAction( 992 pDocument, pUndoPage, rName, pUndoPage->GetAutoLayout(), 993 aVisibleLayers.IsSet( nBackground ), 994 aVisibleLayers.IsSet( nBgObj )); 995 pManager->AddUndoAction( pAction ); 996 997 // rename 998 pPageToRename->SetName( rName ); 999 1000 if( ePageKind == PK_STANDARD ) 1001 { 1002 // also rename notes-page 1003 SdPage* pNotesPage = pDocument->GetSdPage( nPageId, PK_NOTES ); 1004 if (pNotesPage != NULL) 1005 pNotesPage->SetName (rName); 1006 } 1007 } 1008 } 1009 else 1010 { 1011 // rename MasterPage -> rename LayoutTemplate 1012 pPageToRename = pDocument->GetMasterSdPage( nPageId, ePageKind ); 1013 if (pPageToRename != NULL) 1014 { 1015 const String aOldLayoutName( pPageToRename->GetLayoutName() ); 1016 pManager->AddUndoAction( new RenameLayoutTemplateUndoAction( pDocument, aOldLayoutName, rName ) ); 1017 pDocument->RenameLayoutTemplate( aOldLayoutName, rName ); 1018 } 1019 } 1020 1021 bool bSuccess = pPageToRename!=NULL && ( sal_False != rName.Equals( pPageToRename->GetName())); 1022 1023 if( bSuccess ) 1024 { 1025 // user edited page names may be changed by the page so update control 1026 // aTabControl.SetPageText( nPageId, rName ); 1027 1028 // set document to modified state 1029 pDocument->SetChanged( sal_True ); 1030 1031 // inform navigator about change 1032 SfxBoolItem aItem( SID_NAVIGATOR_INIT, sal_True ); 1033 if (mrSlideSorter.GetViewShell() != NULL) 1034 mrSlideSorter.GetViewShell()->GetDispatcher()->Execute( 1035 SID_NAVIGATOR_INIT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L ); 1036 } 1037 1038 return bSuccess; 1039 } 1040 1041 1042 1043 1044 /** Insert a slide. The insertion position depends on a) the selection and 1045 b) the mouse position when there is no selection. 1046 1047 When there is a selection then insertion takes place after the last 1048 slide of the selection. For this to work all but the last selected 1049 slide are deselected first. 1050 1051 Otherwise, when there is no selection but the insertion marker is visible 1052 the slide is inserted at that position. The slide before that marker is 1053 selected first. 1054 1055 When both the selection and the insertion marker are not visible--can 1056 that happen?--the new slide is inserted after the last slide. 1057 */ 1058 void SlotManager::InsertSlide (SfxRequest& rRequest) 1059 { 1060 const sal_Int32 nInsertionIndex (GetInsertionPosition()); 1061 1062 PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter); 1063 1064 SdPage* pNewPage = NULL; 1065 if (mrSlideSorter.GetModel().GetEditMode() == EM_PAGE) 1066 { 1067 SlideSorterViewShell* pShell = dynamic_cast<SlideSorterViewShell*>( 1068 mrSlideSorter.GetViewShell()); 1069 if (pShell != NULL) 1070 { 1071 pNewPage = pShell->CreateOrDuplicatePage ( 1072 rRequest, 1073 mrSlideSorter.GetModel().GetPageType(), 1074 nInsertionIndex>=0 1075 ? mrSlideSorter.GetModel().GetPageDescriptor(nInsertionIndex)->GetPage() 1076 : NULL); 1077 } 1078 } 1079 else 1080 { 1081 // Use the API to create a new page. 1082 SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); 1083 Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier ( 1084 pDocument->getUnoModel(), UNO_QUERY); 1085 if (xMasterPagesSupplier.is()) 1086 { 1087 Reference<drawing::XDrawPages> xMasterPages ( 1088 xMasterPagesSupplier->getMasterPages()); 1089 if (xMasterPages.is()) 1090 { 1091 xMasterPages->insertNewByIndex (nInsertionIndex+1); 1092 1093 // Create shapes for the default layout. 1094 pNewPage = pDocument->GetMasterSdPage( 1095 (sal_uInt16)(nInsertionIndex+1), PK_STANDARD); 1096 pNewPage->CreateTitleAndLayout (sal_True,sal_True); 1097 } 1098 } 1099 } 1100 if (pNewPage == NULL) 1101 return; 1102 1103 // When a new page has been inserted then select it, make it the 1104 // current page, and focus it. 1105 view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); 1106 PageSelector::UpdateLock aUpdateLock (mrSlideSorter); 1107 mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); 1108 mrSlideSorter.GetController().GetPageSelector().SelectPage(pNewPage); 1109 } 1110 1111 1112 1113 1114 void SlotManager::DuplicateSelectedSlides (SfxRequest& rRequest) 1115 { 1116 // Create a list of the pages that are to be duplicated. The process of 1117 // duplication alters the selection. 1118 sal_Int32 nInsertPosition (0); 1119 ::std::vector<SdPage*> aPagesToDuplicate; 1120 model::PageEnumeration aSelectedPages ( 1121 model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel())); 1122 while (aSelectedPages.HasMoreElements()) 1123 { 1124 model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); 1125 if (pDescriptor && pDescriptor->GetPage()) 1126 { 1127 aPagesToDuplicate.push_back(pDescriptor->GetPage()); 1128 nInsertPosition = pDescriptor->GetPage()->GetPageNum()+2; 1129 } 1130 } 1131 1132 // Duplicate the pages in aPagesToDuplicate and collect the newly 1133 // created pages in aPagesToSelect. 1134 const bool bUndo (aPagesToDuplicate.size()>1 && mrSlideSorter.GetView().IsUndoEnabled()); 1135 if (bUndo) 1136 mrSlideSorter.GetView().BegUndo(String(SdResId(STR_INSERTPAGE))); 1137 1138 ::std::vector<SdPage*> aPagesToSelect; 1139 for(::std::vector<SdPage*>::const_iterator 1140 iPage(aPagesToDuplicate.begin()), 1141 iEnd(aPagesToDuplicate.end()); 1142 iPage!=iEnd; 1143 ++iPage, nInsertPosition+=2) 1144 { 1145 aPagesToSelect.push_back( 1146 mrSlideSorter.GetViewShell()->CreateOrDuplicatePage( 1147 rRequest, PK_STANDARD, *iPage, nInsertPosition)); 1148 } 1149 aPagesToDuplicate.clear(); 1150 1151 if (bUndo) 1152 mrSlideSorter.GetView().EndUndo(); 1153 1154 // Set the selection to the pages in aPagesToSelect. 1155 PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); 1156 rSelector.DeselectAllPages(); 1157 ::std::for_each ( 1158 aPagesToSelect.begin(), 1159 aPagesToSelect.end(), 1160 ::boost::bind( 1161 static_cast<void (PageSelector::*)(const SdPage*)>(&PageSelector::SelectPage), 1162 ::boost::ref(rSelector), 1163 _1)); 1164 } 1165 1166 1167 1168 1169 void SlotManager::ExecuteCommandAsynchronously (::std::auto_ptr<Command> pCommand) 1170 { 1171 // Ownership of command is (implicitely) transferred to the queue. 1172 maCommandQueue.push(pCommand.get()); 1173 pCommand.release(); 1174 Application::PostUserEvent(LINK(this,SlotManager,UserEventCallback)); 1175 } 1176 1177 IMPL_LINK(SlotManager, UserEventCallback, void*, EMPTYARG) 1178 { 1179 if ( ! maCommandQueue.empty()) 1180 { 1181 Command* pCommand = maCommandQueue.front(); 1182 maCommandQueue.pop(); 1183 1184 if (pCommand != NULL) 1185 { 1186 // The queue ownes the command that has just been removed from 1187 // it. Therefore it is deleted after it has been executed. 1188 (*pCommand)(); 1189 delete pCommand; 1190 } 1191 } 1192 1193 return 1; 1194 } 1195 1196 1197 1198 1199 void SlotManager::ChangeSlideExclusionState ( 1200 const model::SharedPageDescriptor& rpDescriptor, 1201 const bool bExcludeSlide) 1202 { 1203 if (rpDescriptor) 1204 { 1205 mrSlideSorter.GetView().SetState( 1206 rpDescriptor, 1207 model::PageDescriptor::ST_Excluded, 1208 bExcludeSlide); 1209 } 1210 else 1211 { 1212 model::PageEnumeration aSelectedPages ( 1213 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 1214 mrSlideSorter.GetModel())); 1215 while (aSelectedPages.HasMoreElements()) 1216 { 1217 model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); 1218 mrSlideSorter.GetView().SetState( 1219 pDescriptor, 1220 model::PageDescriptor::ST_Excluded, 1221 bExcludeSlide); 1222 } 1223 } 1224 1225 SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings()); 1226 rBindings.Invalidate(SID_PRESENTATION); 1227 rBindings.Invalidate(SID_REHEARSE_TIMINGS); 1228 rBindings.Invalidate(SID_HIDE_SLIDE); 1229 rBindings.Invalidate(SID_SHOW_SLIDE); 1230 mrSlideSorter.GetModel().GetDocument()->SetChanged(); 1231 } 1232 1233 1234 1235 1236 sal_Int32 SlotManager::GetInsertionPosition (void) 1237 { 1238 PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); 1239 1240 // The insertion indicator is preferred. After all the user explicitly 1241 // used it to define the insertion position. 1242 if (mrSlideSorter.GetController().GetInsertionIndicatorHandler()->IsActive()) 1243 { 1244 // Select the page before the insertion indicator. 1245 return mrSlideSorter.GetController().GetInsertionIndicatorHandler()->GetInsertionPageIndex() 1246 - 1; 1247 } 1248 1249 // Is there a stored insertion position? 1250 else if (mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() >= 0) 1251 { 1252 return mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() - 1; 1253 } 1254 1255 // Use the index of the last selected slide. 1256 else if (rSelector.GetSelectedPageCount() > 0) 1257 { 1258 for (int nIndex=rSelector.GetPageCount()-1; nIndex>=0; --nIndex) 1259 if (rSelector.IsPageSelected(nIndex)) 1260 return nIndex; 1261 1262 // We should never get here. 1263 OSL_ASSERT(false); 1264 return rSelector.GetPageCount() - 1; 1265 } 1266 1267 // Select the last page when there is at least one page. 1268 else if (rSelector.GetPageCount() > 0) 1269 { 1270 return rSelector.GetPageCount() - 1; 1271 } 1272 1273 // Hope for the best that CreateOrDuplicatePage() can cope with an empty 1274 // selection. 1275 else 1276 { 1277 // We should never get here because there has to be at least one page. 1278 OSL_ASSERT(false); 1279 return -1; 1280 } 1281 } 1282 1283 1284 1285 1286 void SlotManager::NotifyEditModeChange (void) 1287 { 1288 SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings()); 1289 rBindings.Invalidate(SID_PRESENTATION); 1290 rBindings.Invalidate(SID_INSERTPAGE); 1291 rBindings.Invalidate(SID_DUPLICATE_PAGE); 1292 } 1293 1294 1295 1296 1297 //----------------------------------------------------------------------------- 1298 1299 namespace { 1300 1301 1302 1303 SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet) 1304 { 1305 SlideExclusionState eState (UNDEFINED); 1306 sal_Bool bState; 1307 1308 // Get toggle state of the selected pages. 1309 while (rPageSet.HasMoreElements() && eState!=MIXED) 1310 { 1311 bState = rPageSet.GetNextElement()->GetPage()->IsExcluded(); 1312 switch (eState) 1313 { 1314 case UNDEFINED: 1315 // Use the first selected page to set the inital value. 1316 eState = bState ? EXCLUDED : INCLUDED; 1317 break; 1318 1319 case EXCLUDED: 1320 // The pages before where all not part of the show, 1321 // this one is. 1322 if ( ! bState) 1323 eState = MIXED; 1324 break; 1325 1326 case INCLUDED: 1327 // The pages before where all part of the show, 1328 // this one is not. 1329 if (bState) 1330 eState = MIXED; 1331 break; 1332 1333 case MIXED: 1334 default: 1335 // No need to change anything. 1336 break; 1337 } 1338 } 1339 1340 return eState; 1341 } 1342 1343 } // end of anonymous namespace 1344 1345 } } } // end of namespace ::sd::slidesorter::controller 1346 1347