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 #ifndef SD_SLIDESORTER_CONTROLLER_SELECTION_MANAGER_HXX 25 #define SD_SLIDESORTER_CONTROLLER_SELECTION_MANAGER_HXX 26 27 #include "model/SlsSharedPageDescriptor.hxx" 28 #include "controller/SlsAnimator.hxx" 29 #include <sal/types.h> 30 #include <tools/gen.hxx> 31 #include <basegfx/range/b2irectangle.hxx> 32 #include <vector> 33 34 class Link; 35 class SdPage; 36 37 namespace sd { namespace slidesorter { 38 class SlideSorter; 39 } } 40 41 namespace sd { namespace slidesorter { namespace controller { 42 43 class SlideSorterController; 44 class SelectionObserver; 45 46 /** This class is a part of the controller and handles the selection of 47 slides. 48 <p>It has methods to modify the selected slides (delete them or 49 move them to other places in the document), change the visible area so 50 to make the selected slides visble, tell listeners when the selection 51 changes.</p> 52 */ 53 class SelectionManager 54 { 55 public: 56 /** Create a new SelectionManger for the given slide sorter. 57 */ 58 SelectionManager (SlideSorter& rSlideSorter); 59 60 ~SelectionManager (void); 61 62 /** Delete the currently selected slides. When this method returns the 63 selection is empty. 64 @param bSelectFollowingPage 65 When <TRUE/> then after deleting the selected pages make the 66 slide after the last selected page the new current page. 67 When <FALSE/> then make the first slide before the selected 68 pages the new current slide. 69 */ 70 void DeleteSelectedPages (const bool bSelectFollowingPage = true); 71 72 /** Call this method after the selection has changed (possible several 73 calls to the PageSelector) to invalidate the relevant slots and send 74 appropriate events. 75 */ 76 void SelectionHasChanged (const bool bMakeSelectionVisible = true); 77 78 /** Add a listener that is called when the selection of the slide sorter 79 changes. 80 @param rListener 81 When this method is called multiple times for the same listener 82 the second and all following calls are ignored. Each listener 83 is added only once. 84 */ 85 void AddSelectionChangeListener (const Link& rListener); 86 87 /** Remove a listener that was called when the selection of the slide 88 sorter changes. 89 @param rListener 90 It is save to pass a listener that was not added are has been 91 removed previously. Such calls are ignored. 92 */ 93 void RemoveSelectionChangeListener (const Link& rListener); 94 95 /** Return the position where to insert pasted slides based on the 96 current selection. When there is a selection then the insert 97 position is behind the last slide. When the selection is empty then 98 most of the time the insert position is at the end of the document. 99 There is an exception right after the display of a popup-menu. The 100 position of the associated insertion marker is stored here and reset 101 the next time the selection changes. 102 */ 103 sal_Int32 GetInsertionPosition (void) const; 104 105 /** Store an insertion position temporarily. It is reset when the 106 selection changes the next time. 107 */ 108 void SetInsertionPosition (const sal_Int32 nInsertionPosition); 109 110 ::boost::shared_ptr<SelectionObserver> GetSelectionObserver (void) const; 111 112 private: 113 SlideSorter& mrSlideSorter; 114 SlideSorterController& mrController; 115 116 ::std::vector<Link> maSelectionChangeListeners; 117 118 /** This array stores the indices of the selected page descriptors at 119 the time when the edit mode is switched to EM_MASTERPAGE. With this 120 we can restore the selection when switching back to EM_PAGE mode. 121 */ 122 ::std::vector<SdPage*> maSelectionBeforeSwitch; 123 124 /** When this flag is set then on the next call to Paint() the selection 125 is moved into the visible area. 126 */ 127 bool mbIsMakeSelectionVisiblePending; 128 129 /** The insertion position is only temporarily valid. Negative values 130 indicate that the explicit insertion position is not valid. In this 131 case GetInsertionPosition() calculates it from the current selection. 132 */ 133 sal_Int32 mnInsertionPosition; 134 135 /** Animation id for a scroll animation the will eventually set the top 136 and left of the visible area to maRequestedTopLeft. 137 */ 138 Animator::AnimationId mnAnimationId; 139 Point maRequestedTopLeft; 140 141 class PageInsertionListener; 142 ::boost::scoped_ptr<PageInsertionListener> mpPageInsertionListener; 143 144 ::boost::shared_ptr<SelectionObserver> mpSelectionObserver; 145 146 /** Delete the given list of normal pages. This method is a helper 147 function for DeleteSelectedPages(). 148 @param rSelectedNormalPages 149 A list of normal pages. Supplying master pages is an error. 150 */ 151 void DeleteSelectedNormalPages (const ::std::vector<SdPage*>& rSelectedNormalPages); 152 153 /** Delete the given list of master pages. This method is a helper 154 function for DeleteSelectedPages(). 155 @param rSelectedMasterPages 156 A list of master pages. Supplying normal pages is an error. 157 */ 158 void DeleteSelectedMasterPages (const ::std::vector<SdPage*>& rSelectedMasterPages); 159 }; 160 161 } } } // end of namespace ::sd::slidesorter::controller 162 163 #endif 164