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_SLIDE_SORTER_CONTROLLER_HXX 25 #define SD_SLIDESORTER_SLIDE_SORTER_CONTROLLER_HXX 26 27 #include "model/SlsSharedPageDescriptor.hxx" 28 #include "ViewShell.hxx" 29 30 #include <com/sun/star/drawing/XDrawPages.hpp> 31 32 #include <sfx2/shell.hxx> 33 #include <sfx2/viewfac.hxx> 34 #include <tools/link.hxx> 35 #include <tools/gen.hxx> 36 #include <comphelper/implementationreference.hxx> 37 38 namespace sd { namespace slidesorter { 39 class SlideSorter; 40 } } 41 42 namespace sd { namespace slidesorter { namespace view { 43 class SlideSorterView; 44 class HighlightObject; 45 } } } 46 47 namespace sd { namespace slidesorter { namespace model { 48 class SlideSorterModel; 49 } } } 50 51 namespace css = ::com::sun::star; 52 53 namespace sd { namespace slidesorter { namespace controller { 54 55 class Animator; 56 class Clipboard; 57 class CurrentSlideManager; 58 class FocusManager; 59 class InsertionIndicatorHandler; 60 class Listener; 61 class PageSelector; 62 class ScrollBarManager; 63 class SelectionFunction; 64 class SelectionManager; 65 class SelectionObserver; 66 class SlotManager; 67 class VisibleAreaManager; 68 69 class SlideSorterController 70 { 71 public: 72 /** Create a new controller for the slide sorter. 73 @param pParentWindow 74 The window that contains the controls of the new 75 controller. 76 */ 77 SlideSorterController (SlideSorter& rSlideSorter); 78 79 /** Late initialization. Call this method once a new new object has been 80 created. 81 */ 82 virtual void Init (void); 83 84 virtual ~SlideSorterController (void); 85 86 void Dispose (void); 87 88 /** Place and size the scroll bars and the browser window so that the 89 given rectangle is filled. 90 @return 91 The space occupied by the browser window is returned. 92 */ 93 Rectangle Resize (const Rectangle& rAvailableSpace); 94 95 /** Determine which of the UI elements--the scroll bars, the scroll bar 96 filler, the actual slide sorter view--are visible and place them in 97 the area last passed to Resize(). 98 @param bForce 99 When <TRUE/> is given (<FALSE/> is the default) then the content 100 window and with it the SlideSorterView is resized event when its 101 size does not change (the size does change when the visibility 102 of scroll bars changes.) 103 @return 104 Returns the space occupied by the browser window. 105 */ 106 Rectangle Rearrange (bool bForce = false); 107 108 /** Return the descriptor of the page that is rendered under the 109 given position. This takes the IsOnlyPreviewTriggersMouseOver 110 property into account. 111 @return 112 Returns a pointer to a page descriptor instead of a 113 reference because when no page is found at the position 114 then NULL is returned to indicate this. 115 */ 116 model::SharedPageDescriptor GetPageAt (const Point& rPixelPosition); 117 118 PageSelector& GetPageSelector (void); 119 FocusManager& GetFocusManager (void); 120 controller::Clipboard& GetClipboard (void); 121 122 /** Return the object that manages the scroll bars. 123 */ 124 ScrollBarManager& GetScrollBarManager (void); 125 126 ::boost::shared_ptr<CurrentSlideManager> GetCurrentSlideManager (void) const; 127 ::boost::shared_ptr<SlotManager> GetSlotManager (void) const; 128 ::boost::shared_ptr<SelectionManager> GetSelectionManager (void) const; 129 ::boost::shared_ptr<InsertionIndicatorHandler> GetInsertionIndicatorHandler (void) const; 130 131 /** This method forwards the call to the SlideSorterView and executes 132 pending operations like moving selected pages into the visible area. 133 */ 134 void Paint (const Rectangle& rRect, ::Window* pWin); 135 136 void FuTemporary (SfxRequest& rRequest); 137 void FuPermanent (SfxRequest& rRequest); 138 void FuSupport (SfxRequest& rRequest); 139 bool Command ( 140 const CommandEvent& rEvent, 141 ::sd::Window* pWindow); 142 143 void GetCtrlState (SfxItemSet &rSet); 144 void GetStatusBarState (SfxItemSet& rSet); 145 146 void ExecCtrl (SfxRequest& rRequest); 147 void GetAttrState (SfxItemSet& rSet); 148 void ExecStatusBar (SfxRequest& rRequest); 149 150 bool IsLocked (void) const; 151 152 /** Create an object of this inner class to prevent updates due to model 153 changes. 154 */ 155 class ModelChangeLock 156 {public: 157 ModelChangeLock (SlideSorterController& rController); 158 ~ModelChangeLock (void); 159 void Release (void); 160 private: 161 SlideSorterController* mpController; 162 }; 163 friend class ModelChangeLock; 164 165 166 /** Handle a change of the model, that is, handle the removal and 167 insertion of whole pages or a change of the edit mode. 168 169 This method is a convenience function that simply calls 170 PreModelChange() and then PostModelChange(). 171 */ 172 void HandleModelChange (void); 173 174 DECL_LINK(WindowEventHandler, VclWindowEvent*); 175 176 /** Update the display of all pages. This involves a redraw and 177 releasing previews and caches. 178 */ 179 void UpdateAllPages (void); 180 181 /** This factory method creates a selection function. 182 */ 183 virtual FunctionReference CreateSelectionFunction (SfxRequest& rRequest); 184 185 /** When the current function of the view shell is the slide sorter 186 selection function then return a reference to it. Otherwise return 187 an empty reference. 188 */ 189 ::rtl::Reference<SelectionFunction> GetCurrentSelectionFunction (void); 190 191 /** Prepare for a change of the edit mode. Depending on the current 192 edit mode we may save the selection so that it can be restored when 193 later changing back to the current edit mode. 194 */ 195 void PrepareEditModeChange (void); 196 197 /** Set a new edit mode and return whether the edit mode really 198 has been changed. For proper saving and restoring of the selection 199 this method should be called between calls to 200 PrepareEditModeChange() and FinishEditModeChange(). 201 @return 202 A return value of <TRUE/> indicates that the edit mode has 203 changed. 204 */ 205 bool ChangeEditMode (EditMode eEditMode); 206 207 /** Finish the change of the edit mode. Here we may select a page or 208 restore a previously saved selection. 209 */ 210 void FinishEditModeChange (void); 211 212 /** Call this method when the name of one of the pages has changed. 213 This is then notified to the accessibility object, when that exists. 214 @param nPageIndex 215 The index of the page whose name has been changed. 216 @param rsOldName 217 The old name of the page. The new name can be taken from the 218 page object. 219 */ 220 void PageNameHasChanged (int nPageIndex, const String& rsOldName); 221 222 /** Return whether a context menu has been opened by the called 223 SlideSorterController object and is still open. 224 */ 225 bool IsContextMenuOpen (void) const; 226 227 /** Provide the set of pages to be displayed in the slide sorter. The 228 GetDocumentSlides() method can be found only in the SlideSorterModel. 229 */ 230 void SetDocumentSlides (const css::uno::Reference<css::container::XIndexAccess>& rxSlides); 231 232 /** Return an Animator object. 233 */ 234 ::boost::shared_ptr<Animator> GetAnimator (void) const; 235 236 VisibleAreaManager& GetVisibleAreaManager (void) const; 237 238 void CheckForMasterPageAssignment (void); 239 void CheckForSlideTransitionAssignment (void); 240 241 private: 242 SlideSorter& mrSlideSorter; 243 model::SlideSorterModel& mrModel; 244 view::SlideSorterView& mrView; 245 ::boost::scoped_ptr<PageSelector> mpPageSelector; 246 ::boost::scoped_ptr<FocusManager> mpFocusManager; 247 ::boost::shared_ptr<SlotManager> mpSlotManager; 248 ::boost::scoped_ptr<controller::Clipboard> mpClipboard; 249 ::boost::scoped_ptr<ScrollBarManager> mpScrollBarManager; 250 mutable ::boost::shared_ptr<CurrentSlideManager> mpCurrentSlideManager; 251 ::boost::shared_ptr<SelectionManager> mpSelectionManager; 252 ::boost::shared_ptr<InsertionIndicatorHandler> mpInsertionIndicatorHandler; 253 ::boost::shared_ptr<Animator> mpAnimator; 254 ::boost::scoped_ptr<VisibleAreaManager> mpVisibleAreaManager; 255 256 // The listener listens to UNO events and thus is a UNO object. 257 // For proper life time management and at the same time free access to 258 // the implementation object we use the ImplementationReference class. 259 ::rtl::Reference<controller::Listener> mpListener; 260 261 int mnModelChangeLockCount; 262 bool mbIsForcedRearrangePending; 263 264 bool mbPreModelChangeDone; 265 bool mbPostModelChangePending; 266 267 ::std::vector<Link> maSelectionChangeListeners; 268 269 /** This array stores the indices of the selected page descriptors at 270 the time when the edit mode is switched to EM_MASTERPAGE. With this 271 we can restore the selection when switching back to EM_PAGE mode. 272 */ 273 ::std::vector<SdPage*> maSelectionBeforeSwitch; 274 /// The current page before the edit mode is switched to EM_MASTERPAGE. 275 int mnCurrentPageBeforeSwitch; 276 277 /** The master page to select after the edit mode is changed. This 278 member is used to pass the pointer from PrepareEditModeChange() to 279 FinishEditModeChange(). 280 */ 281 SdPage* mpEditModeChangeMasterPage; 282 283 /** This rectangle in the parent window encloses scroll bars and slide 284 sorter window. It is set when Resize() is called. 285 */ 286 Rectangle maTotalWindowArea; 287 288 /** This counter is used to avoid processing of reentrant calls to 289 Paint(). 290 */ 291 sal_Int32 mnPaintEntranceCount; 292 293 /** Remember whether the context menu is open. 294 */ 295 bool mbIsContextMenuOpen; 296 297 /** Delete the given list of normal pages. This method is a helper 298 function for DeleteSelectedPages(). 299 @param rSelectedNormalPages 300 A list of normal pages. Supplying master pages is an error. 301 */ 302 void DeleteSelectedNormalPages (const ::std::vector<SdPage*>& rSelectedNormalPages); 303 304 /** Delete the given list of master pages. This method is a helper 305 function for DeleteSelectedPages(). 306 @param rSelectedMasterPages 307 A list of master pages. Supplying normal pages is an error. 308 */ 309 void DeleteSelectedMasterPages (const ::std::vector<SdPage*>& rSelectedMasterPages); 310 311 /** Prepare for several model changes, i.e. prevent time-consuming and 312 non-critical operations like repaints until UnlockModelChange() is 313 called. Critical operations like releasing references to pages that 314 do not exist anymore are executed. 315 */ 316 void LockModelChange (void); 317 318 /** Further calls to HandleModelChange() will result in a full featured 319 update of model, view, and controller. When HandleModelChange() has 320 been called since the last LockModelChange() then this is done right 321 away to bring the view up-to-date. 322 */ 323 void UnlockModelChange (void); 324 325 /** Prepare for a model change. This method does all the things that 326 need to be done _before_ the model changes, e.g. because they need 327 access to the model data before the change. 328 */ 329 void PreModelChange (void); 330 331 /** Complete a model change. This includes the recreation of data 332 structures that depend on the model and the request for a repaint to 333 show the changes. 334 */ 335 void PostModelChange (void); 336 }; 337 338 } } } // end of namespace ::sd::slidesorter::controller 339 340 #endif 341