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 rSelector, 1163 _1)); 1164 } 1165 1166 void SlotManager::ExecuteCommandAsynchronously (::std::auto_ptr<Command> pCommand) 1167 { 1168 // Ownership of command is (implicitely) transferred to the queue. 1169 maCommandQueue.push(pCommand.get()); 1170 pCommand.release(); 1171 Application::PostUserEvent(LINK(this,SlotManager,UserEventCallback)); 1172 } 1173 1174 IMPL_LINK(SlotManager, UserEventCallback, void*, EMPTYARG) 1175 { 1176 if ( ! maCommandQueue.empty()) 1177 { 1178 Command* pCommand = maCommandQueue.front(); 1179 maCommandQueue.pop(); 1180 1181 if (pCommand != NULL) 1182 { 1183 // The queue ownes the command that has just been removed from 1184 // it. Therefore it is deleted after it has been executed. 1185 (*pCommand)(); 1186 delete pCommand; 1187 } 1188 } 1189 1190 return 1; 1191 } 1192 1193 1194 1195 1196 void SlotManager::ChangeSlideExclusionState ( 1197 const model::SharedPageDescriptor& rpDescriptor, 1198 const bool bExcludeSlide) 1199 { 1200 if (rpDescriptor) 1201 { 1202 mrSlideSorter.GetView().SetState( 1203 rpDescriptor, 1204 model::PageDescriptor::ST_Excluded, 1205 bExcludeSlide); 1206 } 1207 else 1208 { 1209 model::PageEnumeration aSelectedPages ( 1210 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 1211 mrSlideSorter.GetModel())); 1212 while (aSelectedPages.HasMoreElements()) 1213 { 1214 model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); 1215 mrSlideSorter.GetView().SetState( 1216 pDescriptor, 1217 model::PageDescriptor::ST_Excluded, 1218 bExcludeSlide); 1219 } 1220 } 1221 1222 SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings()); 1223 rBindings.Invalidate(SID_PRESENTATION); 1224 rBindings.Invalidate(SID_REHEARSE_TIMINGS); 1225 rBindings.Invalidate(SID_HIDE_SLIDE); 1226 rBindings.Invalidate(SID_SHOW_SLIDE); 1227 mrSlideSorter.GetModel().GetDocument()->SetChanged(); 1228 } 1229 1230 1231 1232 1233 sal_Int32 SlotManager::GetInsertionPosition (void) 1234 { 1235 PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); 1236 1237 // The insertion indicator is preferred. After all the user explicitly 1238 // used it to define the insertion position. 1239 if (mrSlideSorter.GetController().GetInsertionIndicatorHandler()->IsActive()) 1240 { 1241 // Select the page before the insertion indicator. 1242 return mrSlideSorter.GetController().GetInsertionIndicatorHandler()->GetInsertionPageIndex() 1243 - 1; 1244 } 1245 1246 // Is there a stored insertion position? 1247 else if (mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() >= 0) 1248 { 1249 return mrSlideSorter.GetController().GetSelectionManager()->GetInsertionPosition() - 1; 1250 } 1251 1252 // Use the index of the last selected slide. 1253 else if (rSelector.GetSelectedPageCount() > 0) 1254 { 1255 for (int nIndex=rSelector.GetPageCount()-1; nIndex>=0; --nIndex) 1256 if (rSelector.IsPageSelected(nIndex)) 1257 return nIndex; 1258 1259 // We should never get here. 1260 OSL_ASSERT(false); 1261 return rSelector.GetPageCount() - 1; 1262 } 1263 1264 // Select the last page when there is at least one page. 1265 else if (rSelector.GetPageCount() > 0) 1266 { 1267 return rSelector.GetPageCount() - 1; 1268 } 1269 1270 // Hope for the best that CreateOrDuplicatePage() can cope with an empty 1271 // selection. 1272 else 1273 { 1274 // We should never get here because there has to be at least one page. 1275 OSL_ASSERT(false); 1276 return -1; 1277 } 1278 } 1279 1280 1281 1282 1283 void SlotManager::NotifyEditModeChange (void) 1284 { 1285 SfxBindings& rBindings (mrSlideSorter.GetViewShell()->GetViewFrame()->GetBindings()); 1286 rBindings.Invalidate(SID_PRESENTATION); 1287 rBindings.Invalidate(SID_INSERTPAGE); 1288 rBindings.Invalidate(SID_DUPLICATE_PAGE); 1289 } 1290 1291 1292 1293 1294 //----------------------------------------------------------------------------- 1295 1296 namespace { 1297 1298 1299 1300 SlideExclusionState GetSlideExclusionState (model::PageEnumeration& rPageSet) 1301 { 1302 SlideExclusionState eState (UNDEFINED); 1303 sal_Bool bState; 1304 1305 // Get toggle state of the selected pages. 1306 while (rPageSet.HasMoreElements() && eState!=MIXED) 1307 { 1308 bState = rPageSet.GetNextElement()->GetPage()->IsExcluded(); 1309 switch (eState) 1310 { 1311 case UNDEFINED: 1312 // Use the first selected page to set the inital value. 1313 eState = bState ? EXCLUDED : INCLUDED; 1314 break; 1315 1316 case EXCLUDED: 1317 // The pages before where all not part of the show, 1318 // this one is. 1319 if ( ! bState) 1320 eState = MIXED; 1321 break; 1322 1323 case INCLUDED: 1324 // The pages before where all part of the show, 1325 // this one is not. 1326 if (bState) 1327 eState = MIXED; 1328 break; 1329 1330 case MIXED: 1331 default: 1332 // No need to change anything. 1333 break; 1334 } 1335 } 1336 1337 return eState; 1338 } 1339 1340 } // end of anonymous namespace 1341 1342 } } } // end of namespace ::sd::slidesorter::controller 1343 1344