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 ->RequestSidebarPanel( 195 sd::framework::FrameworkHelper::msSlideTransitionTaskPanelURL); 196 rRequest.Ignore (); 197 break; 198 } 199 200 case SID_PRESENTATION_DLG: 201 FuSlideShowDlg::Create ( 202 pShell, 203 mrSlideSorter.GetContentWindow().get(), 204 &mrSlideSorter.GetView(), 205 pDocument, 206 rRequest); 207 break; 208 209 case SID_CUSTOMSHOW_DLG: 210 FuCustomShowDlg::Create ( 211 pShell, 212 mrSlideSorter.GetContentWindow().get(), 213 &mrSlideSorter.GetView(), 214 pDocument, 215 rRequest); 216 break; 217 218 case SID_EXPAND_PAGE: 219 FuExpandPage::Create ( 220 pShell, 221 mrSlideSorter.GetContentWindow().get(), 222 &mrSlideSorter.GetView(), 223 pDocument, 224 rRequest); 225 break; 226 227 case SID_SUMMARY_PAGE: 228 FuSummaryPage::Create ( 229 pShell, 230 mrSlideSorter.GetContentWindow().get(), 231 &mrSlideSorter.GetView(), 232 pDocument, 233 rRequest); 234 break; 235 236 case SID_INSERTPAGE: 237 case SID_INSERT_MASTER_PAGE: 238 InsertSlide(rRequest); 239 rRequest.Done(); 240 break; 241 242 case SID_DUPLICATE_PAGE: 243 DuplicateSelectedSlides(rRequest); 244 rRequest.Done(); 245 break; 246 247 case SID_DELETE_PAGE: 248 case SID_DELETE_MASTER_PAGE: 249 case SID_DELETE: // we need SID_CUT to handle the delete key 250 // (DEL -> accelerator -> SID_CUT). 251 if (mrSlideSorter.GetModel().GetPageCount() > 1) 252 { 253 mrSlideSorter.GetController().GetSelectionManager()->DeleteSelectedPages(); 254 } 255 256 rRequest.Done(); 257 break; 258 259 case SID_RENAMEPAGE: 260 case SID_RENAME_MASTER_PAGE: 261 RenameSlide (); 262 rRequest.Done (); 263 break; 264 265 case SID_ASSIGN_LAYOUT: 266 { 267 pShell->mpImpl->AssignLayout( rRequest, mrSlideSorter.GetModel().GetPageType() ); 268 rRequest.Done (); 269 } 270 break; 271 272 default: 273 break; 274 } 275 } 276 277 278 279 280 void SlotManager::FuPermanent (SfxRequest& rRequest) 281 { 282 ViewShell* pShell = mrSlideSorter.GetViewShell(); 283 if (pShell == NULL) 284 return; 285 286 if(pShell->GetCurrentFunction().is()) 287 { 288 FunctionReference xEmpty; 289 if (pShell->GetOldFunction() == pShell->GetCurrentFunction()) 290 pShell->SetOldFunction(xEmpty); 291 292 pShell->GetCurrentFunction()->Deactivate(); 293 pShell->SetCurrentFunction(xEmpty); 294 } 295 296 switch(rRequest.GetSlot()) 297 { 298 case SID_OBJECT_SELECT: 299 pShell->SetCurrentFunction( SelectionFunction::Create(mrSlideSorter, rRequest) ); 300 rRequest.Done(); 301 break; 302 303 default: 304 break; 305 } 306 307 if(pShell->GetOldFunction().is()) 308 { 309 pShell->GetOldFunction()->Deactivate(); 310 FunctionReference xEmpty; 311 pShell->SetOldFunction(xEmpty); 312 } 313 314 if(pShell->GetCurrentFunction().is()) 315 { 316 pShell->GetCurrentFunction()->Activate(); 317 pShell->SetOldFunction(pShell->GetCurrentFunction()); 318 } 319 320 //! das ist nur bis das ENUM-Slots sind 321 // Invalidate( SID_OBJECT_SELECT ); 322 } 323 324 void SlotManager::FuSupport (SfxRequest& rRequest) 325 { 326 switch (rRequest.GetSlot()) 327 { 328 case SID_STYLE_FAMILY: 329 if (rRequest.GetArgs() != NULL) 330 { 331 SdDrawDocument* pDocument 332 = mrSlideSorter.GetModel().GetDocument(); 333 if (pDocument != NULL) 334 { 335 const SfxPoolItem& rItem ( 336 rRequest.GetArgs()->Get(SID_STYLE_FAMILY)); 337 pDocument->GetDocSh()->SetStyleFamily( 338 static_cast<const SfxUInt16Item&>(rItem).GetValue()); 339 } 340 } 341 break; 342 343 case SID_PASTE: 344 { 345 SdTransferable* pTransferClip = SD_MOD()->pTransferClip; 346 if( pTransferClip ) 347 { 348 SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell(); 349 350 DrawDocShell* pDocShell = dynamic_cast<DrawDocShell*>(pTransferDocShell); 351 if (pDocShell && pDocShell->GetDoc()->GetPageCount() > 1) 352 { 353 mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest); 354 break; 355 } 356 } 357 ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); 358 if (pBase != NULL) 359 { 360 ::boost::shared_ptr<DrawViewShell> pDrawViewShell ( 361 ::boost::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell())); 362 if (pDrawViewShell.get() != NULL) 363 pDrawViewShell->FuSupport(rRequest); 364 } 365 } 366 break; 367 368 case SID_CUT: 369 case SID_COPY: 370 case SID_DELETE: 371 mrSlideSorter.GetController().GetClipboard().HandleSlotCall(rRequest); 372 break; 373 374 case SID_DRAWINGMODE: 375 case SID_NOTESMODE: 376 case SID_HANDOUTMODE: 377 case SID_DIAMODE: 378 case SID_OUTLINEMODE: 379 { 380 ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); 381 if (pBase != NULL) 382 { 383 framework::FrameworkHelper::Instance(*pBase)->HandleModeChangeSlot( 384 rRequest.GetSlot(), rRequest); 385 rRequest.Done(); 386 } 387 break; 388 } 389 390 case SID_UNDO: 391 { 392 SlideSorterViewShell* pViewShell 393 = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell()); 394 if (pViewShell != NULL) 395 { 396 view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); 397 SlideSorterController::ModelChangeLock aModelLock (mrSlideSorter.GetController()); 398 PageSelector::UpdateLock aUpdateLock (mrSlideSorter); 399 SelectionObserver::Context aContext (mrSlideSorter); 400 pViewShell->ImpSidUndo (sal_False, rRequest); 401 } 402 break; 403 } 404 405 case SID_REDO: 406 { 407 SlideSorterViewShell* pViewShell 408 = dynamic_cast<SlideSorterViewShell*>(mrSlideSorter.GetViewShell()); 409 if (pViewShell != NULL) 410 { 411 view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); 412 SlideSorterController::ModelChangeLock aModelLock (mrSlideSorter.GetController()); 413 PageSelector::UpdateLock aUpdateLock (mrSlideSorter); 414 SelectionObserver::Context aContext (mrSlideSorter); 415 pViewShell->ImpSidRedo (sal_False, rRequest); 416 } 417 break; 418 } 419 420 default: 421 break; 422 } 423 } 424 425 426 427 428 void SlotManager::ExecCtrl (SfxRequest& rRequest) 429 { 430 ViewShell* pViewShell = mrSlideSorter.GetViewShell(); 431 sal_uInt16 nSlot = rRequest.GetSlot(); 432 switch (nSlot) 433 { 434 case SID_RELOAD: 435 { 436 // Undo-Manager leeren 437 mrSlideSorter.GetModel().GetDocument()->GetDocSh()->ClearUndoBuffer(); 438 439 // Normale Weiterleitung an ViewFrame zur Ausfuehrung 440 if (pViewShell != NULL) 441 pViewShell->GetViewFrame()->ExecuteSlot(rRequest); 442 443 // Muss sofort beendet werden 444 return; 445 } 446 447 case SID_OUTPUT_QUALITY_COLOR: 448 case SID_OUTPUT_QUALITY_GRAYSCALE: 449 case SID_OUTPUT_QUALITY_BLACKWHITE: 450 case SID_OUTPUT_QUALITY_CONTRAST: 451 { 452 // flush page cache 453 if (pViewShell != NULL) 454 pViewShell->ExecReq (rRequest); 455 break; 456 } 457 458 case SID_MAIL_SCROLLBODY_PAGEDOWN: 459 { 460 if (pViewShell != NULL) 461 pViewShell->ExecReq (rRequest); 462 break; 463 } 464 465 case SID_OPT_LOCALE_CHANGED: 466 { 467 mrSlideSorter.GetController().UpdateAllPages(); 468 if (pViewShell != NULL) 469 pViewShell->UpdatePreview (pViewShell->GetActualPage()); 470 rRequest.Done(); 471 break; 472 } 473 474 case SID_SEARCH_DLG: 475 // We have to handle the SID_SEARCH_DLG slot explicitly because 476 // in some cases (when the slide sorter is displayed in the 477 // center pane) we want to disable the search dialog. Therefore 478 // we have to handle the execution of that slot as well. 479 // We try to do that by forwarding the request to the view frame 480 // of the view shell. 481 if (pViewShell != NULL) 482 pViewShell->GetViewFrame()->ExecuteSlot(rRequest); 483 break; 484 485 default: 486 break; 487 } 488 } 489 490 491 492 493 void SlotManager::GetAttrState (SfxItemSet& rSet) 494 { 495 // Iteratate over all items. 496 SfxWhichIter aIter (rSet); 497 sal_uInt16 nWhich = aIter.FirstWhich(); 498 while (nWhich) 499 { 500 sal_uInt16 nSlotId (nWhich); 501 if (SfxItemPool::IsWhich(nWhich) && mrSlideSorter.GetViewShell()!=NULL) 502 nSlotId = mrSlideSorter.GetViewShell()->GetPool().GetSlotId(nWhich); 503 switch (nSlotId) 504 { 505 case SID_PAGES_PER_ROW: 506 rSet.Put ( 507 SfxUInt16Item ( 508 nSlotId, 509 (sal_uInt16)mrSlideSorter.GetView().GetLayouter().GetColumnCount() 510 ) 511 ); 512 break; 513 } 514 nWhich = aIter.NextWhich(); 515 } 516 } 517 518 void SlotManager::GetMenuState (SfxItemSet& rSet) 519 { 520 EditMode eEditMode = mrSlideSorter.GetModel().GetEditMode(); 521 ViewShell* pShell = mrSlideSorter.GetViewShell(); 522 DrawDocShell* pDocShell = mrSlideSorter.GetModel().GetDocument()->GetDocSh(); 523 524 if (pShell!=NULL && pShell->GetCurrentFunction().is()) 525 { 526 sal_uInt16 nSId = pShell->GetCurrentFunction()->GetSlotID(); 527 528 rSet.Put( SfxBoolItem( nSId, sal_True ) ); 529 } 530 rSet.Put( SfxBoolItem( SID_DRAWINGMODE, sal_False ) ); 531 rSet.Put( SfxBoolItem( SID_DIAMODE, sal_True ) ); 532 rSet.Put( SfxBoolItem( SID_OUTLINEMODE, sal_False ) ); 533 rSet.Put( SfxBoolItem( SID_NOTESMODE, sal_False ) ); 534 rSet.Put( SfxBoolItem( SID_HANDOUTMODE, sal_False ) ); 535 536 // Vorlagenkatalog darf nicht aufgerufen werden 537 rSet.DisableItem(SID_STYLE_CATALOG); 538 539 if (pShell!=NULL && pShell->IsMainViewShell()) 540 { 541 rSet.DisableItem(SID_SPELL_DIALOG); 542 rSet.DisableItem(SID_SEARCH_DLG); 543 } 544 545 if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_EXPAND_PAGE)) 546 { 547 bool bDisable = true; 548 if (eEditMode == EM_PAGE) 549 { 550 // At least one of the selected pages has to contain an outline 551 // presentation objects in order to enable the expand page menu 552 // entry. 553 model::PageEnumeration aSelectedPages ( 554 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 555 mrSlideSorter.GetModel())); 556 while (aSelectedPages.HasMoreElements()) 557 { 558 SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); 559 SdrObject* pObj = pPage->GetPresObj(PRESOBJ_OUTLINE); 560 if (pObj!=NULL ) 561 { 562 if( !pObj->IsEmptyPresObj() ) 563 { 564 bDisable = false; 565 } 566 else 567 { 568 // check if the object is in edit, than its temporarely not empty 569 SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj ); 570 if( pTextObj ) 571 { 572 OutlinerParaObject* pParaObj = pTextObj->GetEditOutlinerParaObject(); 573 if( pParaObj ) 574 { 575 delete pParaObj; 576 bDisable = false; 577 } 578 } 579 } 580 } 581 } 582 } 583 584 if (bDisable) 585 rSet.DisableItem (SID_EXPAND_PAGE); 586 } 587 588 if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_SUMMARY_PAGE)) 589 { 590 bool bDisable = true; 591 if (eEditMode == EM_PAGE) 592 { 593 // At least one of the selected pages has to contain a title 594 // presentation objects in order to enable the summary page menu 595 // entry. 596 model::PageEnumeration aSelectedPages ( 597 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 598 mrSlideSorter.GetModel())); 599 while (aSelectedPages.HasMoreElements()) 600 { 601 SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); 602 SdrObject* pObj = pPage->GetPresObj(PRESOBJ_TITLE); 603 604 if (pObj!=NULL && !pObj->IsEmptyPresObj()) 605 bDisable = false; 606 } 607 } 608 if (bDisable) 609 rSet.DisableItem (SID_SUMMARY_PAGE); 610 } 611 612 // Starten der Praesentation moeglich? 613 if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_PRESENTATION ) || 614 SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_REHEARSE_TIMINGS ) ) 615 { 616 sal_Bool bDisable = sal_True; 617 model::PageEnumeration aAllPages ( 618 model::PageEnumerationProvider::CreateAllPagesEnumeration(mrSlideSorter.GetModel())); 619 while (aAllPages.HasMoreElements()) 620 { 621 SdPage* pPage = aAllPages.GetNextElement()->GetPage(); 622 623 if( !pPage->IsExcluded() ) 624 bDisable = sal_False; 625 } 626 if( bDisable || pDocShell->IsPreview()) 627 { 628 rSet.DisableItem( SID_PRESENTATION ); 629 rSet.DisableItem( SID_REHEARSE_TIMINGS ); 630 } 631 } 632 633 634 // Disable the rename slots when there are no or more than one slides/master 635 // pages selected. 636 if (rSet.GetItemState(SID_RENAMEPAGE) == SFX_ITEM_AVAILABLE 637 || rSet.GetItemState(SID_RENAME_MASTER_PAGE) == SFX_ITEM_AVAILABLE) 638 { 639 if (mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount() != 1) 640 { 641 rSet.DisableItem(SID_RENAMEPAGE); 642 rSet.DisableItem(SID_RENAME_MASTER_PAGE); 643 } 644 } 645 646 if (rSet.GetItemState(SID_HIDE_SLIDE) == SFX_ITEM_AVAILABLE 647 || rSet.GetItemState(SID_SHOW_SLIDE) == SFX_ITEM_AVAILABLE) 648 { 649 model::PageEnumeration aSelectedPages ( 650 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 651 mrSlideSorter.GetModel())); 652 const SlideExclusionState eState (GetSlideExclusionState(aSelectedPages)); 653 switch (eState) 654 { 655 case MIXED: 656 // Show both entries. 657 break; 658 659 case EXCLUDED: 660 rSet.DisableItem(SID_HIDE_SLIDE); 661 break; 662 663 case INCLUDED: 664 rSet.DisableItem(SID_SHOW_SLIDE); 665 break; 666 667 case UNDEFINED: 668 rSet.DisableItem(SID_HIDE_SLIDE); 669 rSet.DisableItem(SID_SHOW_SLIDE); 670 break; 671 } 672 } 673 674 675 PageKind ePageKind = mrSlideSorter.GetModel().GetPageType(); 676 if ((eEditMode == EM_MASTERPAGE) && (ePageKind != PK_HANDOUT)) 677 { 678 rSet.DisableItem(SID_ASSIGN_LAYOUT); 679 } 680 681 if ((eEditMode == EM_MASTERPAGE) || (ePageKind==PK_NOTES)) 682 { 683 rSet.DisableItem(SID_INSERTPAGE); 684 } 685 686 // Disable some slots when in master page mode. 687 if (eEditMode == EM_MASTERPAGE) 688 { 689 if (rSet.GetItemState(SID_INSERTPAGE) == SFX_ITEM_AVAILABLE) 690 rSet.DisableItem(SID_INSERTPAGE); 691 if (rSet.GetItemState(SID_DUPLICATE_PAGE) == SFX_ITEM_AVAILABLE) 692 rSet.DisableItem(SID_DUPLICATE_PAGE); 693 } 694 } 695 696 697 698 699 void SlotManager::GetClipboardState ( SfxItemSet& rSet) 700 { 701 SdTransferable* pTransferClip = SD_MOD()->pTransferClip; 702 703 if (rSet.GetItemState(SID_PASTE) == SFX_ITEM_AVAILABLE 704 || rSet.GetItemState(SID_PASTE_SPECIAL) == SFX_ITEM_AVAILABLE) 705 { 706 // Keine eigenen Clipboard-Daten? 707 if ( !pTransferClip || !pTransferClip->GetDocShell() ) 708 { 709 rSet.DisableItem(SID_PASTE); 710 rSet.DisableItem(SID_PASTE_SPECIAL); 711 } 712 else 713 { 714 SfxObjectShell* pTransferDocShell = pTransferClip->GetDocShell(); 715 716 if( !pTransferDocShell || ( (DrawDocShell*) pTransferDocShell)->GetDoc()->GetPageCount() <= 1 ) 717 { 718 bool bIsPastingSupported (false); 719 720 // No or just one page. Check if there is anything that can be 721 // pasted via a DrawViewShell. 722 ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); 723 if (pBase != NULL) 724 { 725 ::boost::shared_ptr<DrawViewShell> pDrawViewShell ( 726 ::boost::dynamic_pointer_cast<DrawViewShell>(pBase->GetMainViewShell())); 727 if (pDrawViewShell.get() != NULL) 728 { 729 TransferableDataHelper aDataHelper ( 730 TransferableDataHelper::CreateFromSystemClipboard( 731 pDrawViewShell->GetActiveWindow())); 732 if (aDataHelper.GetFormatCount() > 0) 733 bIsPastingSupported = true; 734 } 735 } 736 737 if ( ! bIsPastingSupported) 738 { 739 rSet.DisableItem(SID_PASTE); 740 rSet.DisableItem(SID_PASTE_SPECIAL); 741 } 742 } 743 } 744 } 745 746 // Cut, copy and paste of master pages is not yet implemented properly 747 if (rSet.GetItemState(SID_COPY) == SFX_ITEM_AVAILABLE 748 || rSet.GetItemState(SID_PASTE) == SFX_ITEM_AVAILABLE 749 || rSet.GetItemState(SID_PASTE_SPECIAL) == SFX_ITEM_AVAILABLE 750 || rSet.GetItemState(SID_CUT) == SFX_ITEM_AVAILABLE) 751 { 752 if (mrSlideSorter.GetModel().GetEditMode() == EM_MASTERPAGE) 753 { 754 if (rSet.GetItemState(SID_CUT) == SFX_ITEM_AVAILABLE) 755 rSet.DisableItem(SID_CUT); 756 if (rSet.GetItemState(SID_COPY) == SFX_ITEM_AVAILABLE) 757 rSet.DisableItem(SID_COPY); 758 if (rSet.GetItemState(SID_PASTE) == SFX_ITEM_AVAILABLE) 759 rSet.DisableItem(SID_PASTE); 760 if (rSet.GetItemState(SID_PASTE_SPECIAL) == SFX_ITEM_AVAILABLE) 761 rSet.DisableItem(SID_PASTE_SPECIAL); 762 } 763 } 764 765 // Cut, copy, and delete page are disabled when there is no selection. 766 if (rSet.GetItemState(SID_CUT) == SFX_ITEM_AVAILABLE 767 || rSet.GetItemState(SID_COPY) == SFX_ITEM_AVAILABLE 768 || rSet.GetItemState(SID_DELETE) == SFX_ITEM_AVAILABLE 769 || rSet.GetItemState(SID_DELETE_PAGE) == SFX_ITEM_AVAILABLE 770 || rSet.GetItemState(SID_DELETE_MASTER_PAGE) == SFX_ITEM_AVAILABLE) 771 { 772 model::PageEnumeration aSelectedPages ( 773 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 774 mrSlideSorter.GetModel())); 775 776 // For copy to work we have to have at least one selected page. 777 if ( ! aSelectedPages.HasMoreElements()) 778 rSet.DisableItem(SID_COPY); 779 780 bool bDisable = false; 781 // The operations that lead to the deletion of a page are valid if 782 // a) there is at least one selected page 783 // b) deleting the selected pages leaves at least one page in the 784 // document 785 // c) selected master pages must not be used by slides. 786 787 // Test a). 788 if ( ! aSelectedPages.HasMoreElements()) 789 bDisable = true; 790 // Test b): Count the number of selected pages. It has to be less 791 // than the number of all pages. 792 else if (mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount() 793 >= mrSlideSorter.GetController().GetPageSelector().GetPageCount()) 794 bDisable = true; 795 // Test c): Iterate over the selected pages and look for a master 796 // page that is used by at least one page. 797 else while (aSelectedPages.HasMoreElements()) 798 { 799 SdPage* pPage = aSelectedPages.GetNextElement()->GetPage(); 800 int nUseCount (mrSlideSorter.GetModel().GetDocument() 801 ->GetMasterPageUserCount(pPage)); 802 if (nUseCount > 0) 803 { 804 bDisable = true; 805 break; 806 } 807 } 808 809 if (bDisable) 810 { 811 rSet.DisableItem(SID_CUT); 812 rSet.DisableItem(SID_DELETE_PAGE); 813 rSet.DisableItem(SID_DELETE_MASTER_PAGE); 814 } 815 } 816 } 817 818 819 820 821 void SlotManager::GetStatusBarState (SfxItemSet& rSet) 822 { 823 // Seitenanzeige und Layout 824 /* 825 if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_PAGE ) || 826 SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_LAYOUT ) ) 827 */ 828 SdPage* pPage = NULL; 829 SdPage* pFirstPage = NULL; 830 sal_uInt16 nFirstPage; 831 sal_uInt16 nSelectedPages = (sal_uInt16)mrSlideSorter.GetController().GetPageSelector().GetSelectedPageCount(); 832 String aPageStr; 833 String aLayoutStr; 834 835 if (nSelectedPages > 0) 836 aPageStr = String(SdResId(STR_SD_PAGE)); 837 838 if (nSelectedPages == 1) 839 { 840 model::PageEnumeration aSelectedPages ( 841 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 842 mrSlideSorter.GetModel())); 843 model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); 844 if (pDescriptor) 845 { 846 pPage = pDescriptor->GetPage(); 847 nFirstPage = pPage->GetPageNum()/2; 848 pFirstPage = pPage; 849 850 aPageStr += sal_Unicode(' '); 851 aPageStr += String::CreateFromInt32( nFirstPage + 1 ); 852 aPageStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " )); 853 aPageStr += String::CreateFromInt32( 854 mrSlideSorter.GetModel().GetPageCount()); 855 856 aLayoutStr = pFirstPage->GetLayoutName(); 857 aLayoutStr.Erase( aLayoutStr.SearchAscii( SD_LT_SEPARATOR ) ); 858 } 859 } 860 861 rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) ); 862 rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) ); 863 864 if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) ) 865 { 866 rSet.Put( SfxVoidItem( SID_ATTR_ZOOMSLIDER ) ); 867 } 868 } 869 870 void SlotManager::ShowSlideShow( SfxRequest& rReq) 871 { 872 Reference< XPresentation2 > xPresentation( mrSlideSorter.GetModel().GetDocument()->getPresentation() ); 873 if( xPresentation.is() ) 874 { 875 if( ( SID_REHEARSE_TIMINGS != rReq.GetSlot() ) ) 876 xPresentation->start(); 877 else 878 xPresentation->rehearseTimings(); 879 } 880 } 881 882 void SlotManager::RenameSlide (void) 883 { 884 PageKind ePageKind = mrSlideSorter.GetModel().GetPageType(); 885 View* pDrView = &mrSlideSorter.GetView(); 886 887 if (ePageKind==PK_STANDARD || ePageKind==PK_NOTES) 888 { 889 if ( pDrView->IsTextEdit() ) 890 { 891 pDrView->SdrEndTextEdit(); 892 } 893 894 SdPage* pSelectedPage = NULL; 895 model::PageEnumeration aSelectedPages ( 896 model::PageEnumerationProvider::CreateSelectedPagesEnumeration( 897 mrSlideSorter.GetModel())); 898 if (aSelectedPages.HasMoreElements()) 899 pSelectedPage = aSelectedPages.GetNextElement()->GetPage(); 900 if (pSelectedPage != NULL) 901 { 902 String aTitle( SdResId( STR_TITLE_RENAMESLIDE ) ); 903 String aDescr( SdResId( STR_DESC_RENAMESLIDE ) ); 904 String aPageName = pSelectedPage->GetName(); 905 906 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 907 DBG_ASSERT(pFact, "Dialogdiet fail!"); 908 AbstractSvxNameDialog* aNameDlg = pFact->CreateSvxNameDialog( 909 mrSlideSorter.GetContentWindow().get(), 910 aPageName, aDescr); 911 DBG_ASSERT(aNameDlg, "Dialogdiet fail!"); 912 aNameDlg->SetText( aTitle ); 913 aNameDlg->SetCheckNameHdl( LINK( this, SlotManager, RenameSlideHdl ), true ); 914 aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE ); 915 916 if( aNameDlg->Execute() == RET_OK ) 917 { 918 String aNewName; 919 aNameDlg->GetName( aNewName ); 920 if( ! aNewName.Equals( aPageName ) ) 921 { 922 #ifdef DBG_UTIL 923 bool bResult = 924 #endif 925 RenameSlideFromDrawViewShell( 926 pSelectedPage->GetPageNum()/2, aNewName ); 927 DBG_ASSERT( bResult, "Couldn't rename slide" ); 928 } 929 } 930 delete aNameDlg; 931 932 // Tell the slide sorter about the name change (necessary for 933 // accessibility.) 934 mrSlideSorter.GetController().PageNameHasChanged( 935 (pSelectedPage->GetPageNum()-1)/2, aPageName); 936 } 937 } 938 } 939 940 IMPL_LINK(SlotManager, RenameSlideHdl, AbstractSvxNameDialog*, pDialog) 941 { 942 if( ! pDialog ) 943 return 0; 944 945 String aNewName; 946 pDialog->GetName( aNewName ); 947 948 model::SharedPageDescriptor pDescriptor ( 949 mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); 950 SdPage* pCurrentPage = NULL; 951 if (pDescriptor.get() != NULL) 952 pCurrentPage = pDescriptor->GetPage(); 953 954 return ( (pCurrentPage!=NULL && aNewName.Equals( pCurrentPage->GetName() )) 955 || (mrSlideSorter.GetViewShell() 956 && mrSlideSorter.GetViewShell()->GetDocSh()->IsNewPageNameValid( aNewName ) )); 957 } 958 959 bool SlotManager::RenameSlideFromDrawViewShell( sal_uInt16 nPageId, const String & rName ) 960 { 961 sal_Bool bOutDummy; 962 SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); 963 if( pDocument->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND ) 964 return false; 965 966 SdPage* pPageToRename = NULL; 967 PageKind ePageKind = mrSlideSorter.GetModel().GetPageType(); 968 969 ::svl::IUndoManager* pManager = pDocument->GetDocSh()->GetUndoManager(); 970 971 if( mrSlideSorter.GetModel().GetEditMode() == EM_PAGE ) 972 { 973 model::SharedPageDescriptor pDescriptor ( 974 mrSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide()); 975 if (pDescriptor.get() != NULL) 976 pPageToRename = pDescriptor->GetPage(); 977 978 if (pPageToRename != NULL) 979 { 980 // Undo 981 SdPage* pUndoPage = pPageToRename; 982 SdrLayerAdmin & rLayerAdmin = pDocument->GetLayerAdmin(); 983 sal_uInt8 nBackground = rLayerAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRND )), sal_False ); 984 sal_uInt8 nBgObj = rLayerAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRNDOBJ )), sal_False ); 985 SetOfByte aVisibleLayers = pPageToRename->TRG_GetMasterPageVisibleLayers(); 986 987 // (#67720#) 988 ModifyPageUndoAction* pAction = new ModifyPageUndoAction( 989 pDocument, pUndoPage, rName, pUndoPage->GetAutoLayout(), 990 aVisibleLayers.IsSet( nBackground ), 991 aVisibleLayers.IsSet( nBgObj )); 992 pManager->AddUndoAction( pAction ); 993 994 // rename 995 pPageToRename->SetName( rName ); 996 997 if( ePageKind == PK_STANDARD ) 998 { 999 // also rename notes-page 1000 SdPage* pNotesPage = pDocument->GetSdPage( nPageId, PK_NOTES ); 1001 if (pNotesPage != NULL) 1002 pNotesPage->SetName (rName); 1003 } 1004 } 1005 } 1006 else 1007 { 1008 // rename MasterPage -> rename LayoutTemplate 1009 pPageToRename = pDocument->GetMasterSdPage( nPageId, ePageKind ); 1010 if (pPageToRename != NULL) 1011 { 1012 const String aOldLayoutName( pPageToRename->GetLayoutName() ); 1013 pManager->AddUndoAction( new RenameLayoutTemplateUndoAction( pDocument, aOldLayoutName, rName ) ); 1014 pDocument->RenameLayoutTemplate( aOldLayoutName, rName ); 1015 } 1016 } 1017 1018 bool bSuccess = pPageToRename!=NULL && ( sal_False != rName.Equals( pPageToRename->GetName())); 1019 1020 if( bSuccess ) 1021 { 1022 // user edited page names may be changed by the page so update control 1023 // aTabControl.SetPageText( nPageId, rName ); 1024 1025 // set document to modified state 1026 pDocument->SetChanged( sal_True ); 1027 1028 // inform navigator about change 1029 SfxBoolItem aItem( SID_NAVIGATOR_INIT, sal_True ); 1030 if (mrSlideSorter.GetViewShell() != NULL) 1031 mrSlideSorter.GetViewShell()->GetDispatcher()->Execute( 1032 SID_NAVIGATOR_INIT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L ); 1033 } 1034 1035 return bSuccess; 1036 } 1037 1038 1039 1040 1041 /** Insert a slide. The insertion position depends on a) the selection and 1042 b) the mouse position when there is no selection. 1043 1044 When there is a selection then insertion takes place after the last 1045 slide of the selection. For this to work all but the last selected 1046 slide are deselected first. 1047 1048 Otherwise, when there is no selection but the insertion marker is visible 1049 the slide is inserted at that position. The slide before that marker is 1050 selected first. 1051 1052 When both the selection and the insertion marker are not visible--can 1053 that happen?--the new slide is inserted after the last slide. 1054 */ 1055 void SlotManager::InsertSlide (SfxRequest& rRequest) 1056 { 1057 const sal_Int32 nInsertionIndex (GetInsertionPosition()); 1058 1059 PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter); 1060 1061 SdPage* pNewPage = NULL; 1062 if (mrSlideSorter.GetModel().GetEditMode() == EM_PAGE) 1063 { 1064 SlideSorterViewShell* pShell = dynamic_cast<SlideSorterViewShell*>( 1065 mrSlideSorter.GetViewShell()); 1066 if (pShell != NULL) 1067 { 1068 pNewPage = pShell->CreateOrDuplicatePage ( 1069 rRequest, 1070 mrSlideSorter.GetModel().GetPageType(), 1071 nInsertionIndex>=0 1072 ? mrSlideSorter.GetModel().GetPageDescriptor(nInsertionIndex)->GetPage() 1073 : NULL); 1074 } 1075 } 1076 else 1077 { 1078 // Use the API to create a new page. 1079 SdDrawDocument* pDocument = mrSlideSorter.GetModel().GetDocument(); 1080 Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier ( 1081 pDocument->getUnoModel(), UNO_QUERY); 1082 if (xMasterPagesSupplier.is()) 1083 { 1084 Reference<drawing::XDrawPages> xMasterPages ( 1085 xMasterPagesSupplier->getMasterPages()); 1086 if (xMasterPages.is()) 1087 { 1088 xMasterPages->insertNewByIndex (nInsertionIndex+1); 1089 1090 // Create shapes for the default layout. 1091 pNewPage = pDocument->GetMasterSdPage( 1092 (sal_uInt16)(nInsertionIndex+1), PK_STANDARD); 1093 pNewPage->CreateTitleAndLayout (sal_True,sal_True); 1094 } 1095 } 1096 } 1097 if (pNewPage == NULL) 1098 return; 1099 1100 // When a new page has been inserted then select it, make it the 1101 // current page, and focus it. 1102 view::SlideSorterView::DrawLock aDrawLock (mrSlideSorter); 1103 PageSelector::UpdateLock aUpdateLock (mrSlideSorter); 1104 mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); 1105 mrSlideSorter.GetController().GetPageSelector().SelectPage(pNewPage); 1106 } 1107 1108 1109 1110 1111 void SlotManager::DuplicateSelectedSlides (SfxRequest& rRequest) 1112 { 1113 // Create a list of the pages that are to be duplicated. The process of 1114 // duplication alters the selection. 1115 sal_Int32 nInsertPosition (0); 1116 ::std::vector<SdPage*> aPagesToDuplicate; 1117 model::PageEnumeration aSelectedPages ( 1118 model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrSlideSorter.GetModel())); 1119 while (aSelectedPages.HasMoreElements()) 1120 { 1121 model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); 1122 if (pDescriptor && pDescriptor->GetPage()) 1123 { 1124 aPagesToDuplicate.push_back(pDescriptor->GetPage()); 1125 nInsertPosition = pDescriptor->GetPage()->GetPageNum()+2; 1126 } 1127 } 1128 1129 // Duplicate the pages in aPagesToDuplicate and collect the newly 1130 // created pages in aPagesToSelect. 1131 const bool bUndo (aPagesToDuplicate.size()>1 && mrSlideSorter.GetView().IsUndoEnabled()); 1132 if (bUndo) 1133 mrSlideSorter.GetView().BegUndo(String(SdResId(STR_INSERTPAGE))); 1134 1135 ::std::vector<SdPage*> aPagesToSelect; 1136 for(::std::vector<SdPage*>::const_iterator 1137 iPage(aPagesToDuplicate.begin()), 1138 iEnd(aPagesToDuplicate.end()); 1139 iPage!=iEnd; 1140 ++iPage, nInsertPosition+=2) 1141 { 1142 aPagesToSelect.push_back( 1143 mrSlideSorter.GetViewShell()->CreateOrDuplicatePage( 1144 rRequest, PK_STANDARD, *iPage, nInsertPosition)); 1145 } 1146 aPagesToDuplicate.clear(); 1147 1148 if (bUndo) 1149 mrSlideSorter.GetView().EndUndo(); 1150 1151 // Set the selection to the pages in aPagesToSelect. 1152 PageSelector& rSelector (mrSlideSorter.GetController().GetPageSelector()); 1153 rSelector.DeselectAllPages(); 1154 ::std::for_each ( 1155 aPagesToSelect.begin(), 1156 aPagesToSelect.end(), 1157 ::boost::bind( 1158 static_cast<void (PageSelector::*)(const SdPage*)>(&PageSelector::SelectPage), 1159 ::boost::ref(rSelector), 1160 _1)); 1161 } 1162 1163 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