/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef SD_SLIDESORTER_CONTROLLER_SELECTION_MANAGER_HXX #define SD_SLIDESORTER_CONTROLLER_SELECTION_MANAGER_HXX #include "model/SlsSharedPageDescriptor.hxx" #include "controller/SlsAnimator.hxx" #include #include #include #include class Link; class SdPage; namespace sd { namespace slidesorter { class SlideSorter; } } namespace sd { namespace slidesorter { namespace controller { class SlideSorterController; class SelectionObserver; /** This class is a part of the controller and handles the selection of slides.

It has methods to modify the selected slides (delete them or move them to other places in the document), change the visible area so to make the selected slides visible, tell listeners when the selection changes.

*/ class SelectionManager { public: /** Create a new SelectionManger for the given slide sorter. */ SelectionManager (SlideSorter& rSlideSorter); ~SelectionManager (void); /** Delete the currently selected slides. When this method returns the selection is empty. @param bSelectFollowingPage When then after deleting the selected pages make the slide after the last selected page the new current page. When then make the first slide before the selected pages the new current slide. */ void DeleteSelectedPages (const bool bSelectFollowingPage = true); /** Call this method after the selection has changed (possible several calls to the PageSelector) to invalidate the relevant slots and send appropriate events. */ void SelectionHasChanged (const bool bMakeSelectionVisible = true); /** Add a listener that is called when the selection of the slide sorter changes. @param rListener When this method is called multiple times for the same listener the second and all following calls are ignored. Each listener is added only once. */ void AddSelectionChangeListener (const Link& rListener); /** Remove a listener that was called when the selection of the slide sorter changes. @param rListener It is save to pass a listener that was not added are has been removed previously. Such calls are ignored. */ void RemoveSelectionChangeListener (const Link& rListener); /** Return the position where to insert pasted slides based on the current selection. When there is a selection then the insert position is behind the last slide. When the selection is empty then most of the time the insert position is at the end of the document. There is an exception right after the display of a popup-menu. The position of the associated insertion marker is stored here and reset the next time the selection changes. */ sal_Int32 GetInsertionPosition (void) const; /** Store an insertion position temporarily. It is reset when the selection changes the next time. */ void SetInsertionPosition (const sal_Int32 nInsertionPosition); ::boost::shared_ptr GetSelectionObserver (void) const; private: SlideSorter& mrSlideSorter; SlideSorterController& mrController; ::std::vector maSelectionChangeListeners; /** This array stores the indices of the selected page descriptors at the time when the edit mode is switched to EM_MASTERPAGE. With this we can restore the selection when switching back to EM_PAGE mode. */ ::std::vector maSelectionBeforeSwitch; /** When this flag is set then on the next call to Paint() the selection is moved into the visible area. */ bool mbIsMakeSelectionVisiblePending; /** The insertion position is only temporarily valid. Negative values indicate that the explicit insertion position is not valid. In this case GetInsertionPosition() calculates it from the current selection. */ sal_Int32 mnInsertionPosition; /** Animation id for a scroll animation the will eventually set the top and left of the visible area to maRequestedTopLeft. */ Animator::AnimationId mnAnimationId; Point maRequestedTopLeft; class PageInsertionListener; ::boost::scoped_ptr mpPageInsertionListener; ::boost::shared_ptr mpSelectionObserver; /** Delete the given list of normal pages. This method is a helper function for DeleteSelectedPages(). @param rSelectedNormalPages A list of normal pages. Supplying master pages is an error. */ void DeleteSelectedNormalPages (const ::std::vector& rSelectedNormalPages); /** Delete the given list of master pages. This method is a helper function for DeleteSelectedPages(). @param rSelectedMasterPages A list of master pages. Supplying normal pages is an error. */ void DeleteSelectedMasterPages (const ::std::vector& rSelectedMasterPages); }; } } } // end of namespace ::sd::slidesorter::controller #endif