xref: /AOO41X/main/sd/source/ui/slidesorter/controller/SlsSlotManager.cxx (revision 1443d43773abe4d9f84815ffd044e019b5698439)
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