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