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