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