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_SELECTION_FUNCTION_HXX 25 #define SD_SLIDESORTER_SELECTION_FUNCTION_HXX 26 27 #include "model/SlsSharedPageDescriptor.hxx" 28 #include "controller/SlsFocusManager.hxx" 29 #include "controller/SlsInsertionIndicatorHandler.hxx" 30 #include "fupoor.hxx" 31 #include <svtools/transfer.hxx> 32 #include <boost/noncopyable.hpp> 33 #include <boost/scoped_ptr.hpp> 34 35 class SdSlideViewShell; 36 class SdWindow; 37 class SdSlideView; 38 class SdDrawDocument; 39 class Sound; 40 41 namespace sd { namespace slidesorter { 42 class SlideSorter; 43 } } 44 45 namespace sd { namespace slidesorter { namespace controller { 46 47 class SlideSorterController; 48 class DragAndDropContext; 49 50 51 class SelectionFunction 52 : public FuPoor, 53 private ::boost::noncopyable 54 { 55 public: 56 TYPEINFO(); 57 58 static FunctionReference Create( SlideSorter& rSlideSorter, SfxRequest& rRequest ); 59 60 // Mouse- & Key-Events 61 virtual sal_Bool KeyInput(const KeyEvent& rKEvt); 62 virtual sal_Bool MouseMove(const MouseEvent& rMEvt); 63 virtual sal_Bool MouseButtonUp(const MouseEvent& rMEvt); 64 virtual sal_Bool MouseButtonDown(const MouseEvent& rMEvt); 65 66 virtual void Activate(); 67 virtual void Deactivate(); 68 69 virtual void ScrollStart(); 70 virtual void ScrollEnd(); 71 72 // Forward to the clipboard manager. 73 virtual void DoCut (void); 74 75 // Forward to the clipboard manager. 76 virtual void DoCopy (void); 77 78 // Forward to the clipboard manager. 79 virtual void DoPaste (void); 80 81 /** is called when the current function should be aborted. <p> 82 This is used when a function gets a KEY_ESCAPE but can also 83 be called directly. 84 85 @returns 86 true if a active function was aborted 87 */ 88 virtual bool cancel(); 89 90 void MouseDragged ( 91 const AcceptDropEvent& rEvent, 92 const sal_Int8 nDragAction); 93 94 /** Turn of substitution display and insertion indicator. 95 */ 96 void NotifyDragFinished (void); 97 98 /** Call when drag-and-drop or multi selection is started or stopped in 99 order to update permission of mouse over indication. 100 */ 101 void UpdateMouseOverIndicationPermission (void); 102 103 class EventDescriptor; 104 class ModeHandler; 105 friend class ModeHandler; 106 enum Mode 107 { 108 NormalMode, 109 MultiSelectionMode, 110 DragAndDropMode, 111 ButtonMode 112 }; 113 void SwitchToNormalMode (void); 114 void SwitchToDragAndDropMode(const Point aMousePosition); 115 void SwitchToMultiSelectionMode (const Point aMousePosition, const sal_uInt32 nEventCode); 116 bool SwitchToButtonMode (void); 117 118 void ResetShiftKeySelectionAnchor (void); 119 /** Special case handling for when the context menu is hidden. This 120 method will reinitialize the current mouse position to prevent the 121 mouse motion during the time the context menu is displayed from 122 being interpreted as drag-and-drop start. 123 */ 124 void ResetMouseAnchor (void); 125 126 protected: 127 SlideSorter& mrSlideSorter; 128 SlideSorterController& mrController; 129 130 SelectionFunction ( 131 SlideSorter& rSlideSorter, 132 SfxRequest& rRequest); 133 134 virtual ~SelectionFunction(); 135 136 private: 137 138 // The rectangle of the mouse drag selection. 139 Rectangle maDragSelectionRectangle; 140 bool mbDragSelection; 141 142 // Box of the insert marker in model coordinates. 143 Rectangle maInsertionMarkerBox; 144 145 /** We use this flag to filter out the cases where MouseMotion() is called 146 with a pressed mouse button but without a prior MouseButtonDown() 147 call. This is an indication that the mouse button was pressed over 148 another control, e.g. the view tab bar, and that a re-layout of the 149 controls moved the slide sorter under the mouse. 150 */ 151 bool mbProcessingMouseButtonDown; 152 153 bool mbIsDeselectionPending; 154 155 /** Remember the slide where the shift key was pressed and started a 156 multiselection via keyboard. 157 */ 158 sal_Int32 mnShiftKeySelectionAnchor; 159 160 /** The selection function can be in one of several mutually 161 exclusive modes. 162 */ 163 ::boost::shared_ptr<ModeHandler> mpModeHandler; 164 165 /** Make the slide nOffset slides away of the current one the new 166 current slide. When the new index is outside the range of valid 167 page numbers it is clipped to that range. 168 @param nOffset 169 When nOffset is negative then go back. When nOffset if positive go 170 forward. When it is zero then ignore the call. 171 */ 172 void GotoNextPage (int nOffset); 173 174 /** Make the slide with the given index the new current slide. 175 @param nIndex 176 Index of the new current slide. When the new index is outside 177 the range of valid page numbers it is clipped to that range. 178 */ 179 void GotoPage (int nIndex); 180 181 void ProcessMouseEvent (sal_uInt32 nEventType, const MouseEvent& rEvent); 182 void ProcessKeyEvent (const KeyEvent& rEvent); 183 184 // What follows are a couple of helper methods that are used by 185 // ProcessMouseEvent(). 186 187 void ProcessEvent (EventDescriptor& rEvent); 188 189 void MoveFocus ( 190 const FocusManager::FocusMoveDirection eDirection, 191 const bool bIsShiftDown, 192 const bool bIsControlDown); 193 194 void StopDragAndDrop (void); 195 196 void SwitchMode (const ::boost::shared_ptr<ModeHandler>& rpHandler); 197 }; 198 199 } } } // end of namespace ::sd::slidesorter::controller 200 201 #endif 202