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