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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 #include <editeng/outliner.hxx> 28 #include <editeng/outlobj.hxx> 29 #include <svx/svdotext.hxx> 30 #include <svx/svdouno.hxx> 31 #include <sfx2/dispatch.hxx> 32 33 #include "fuconstr.hxx" 34 #include "fudraw.hxx" 35 #include "tabvwsh.hxx" 36 #include "futext.hxx" 37 #include "sc.hrc" 38 #include "drawview.hxx" 39 40 // Maximal erlaubte Mausbewegung um noch Drag&Drop zu starten 41 //! fusel,fuconstr,futext - zusammenfassen! 42 #define SC_MAXDRAGMOVE 3 43 44 //------------------------------------------------------------------------ 45 46 /************************************************************************* 47 |* 48 |* Konstruktor 49 |* 50 \************************************************************************/ 51 52 FuConstruct::FuConstruct(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, 53 SdrModel* pDoc, SfxRequest& rReq) : 54 FuDraw(pViewSh, pWin, pViewP, pDoc, rReq) 55 { 56 } 57 58 /************************************************************************* 59 |* 60 |* Destruktor 61 |* 62 \************************************************************************/ 63 64 FuConstruct::~FuConstruct() 65 { 66 } 67 68 sal_uInt8 FuConstruct::Command(const CommandEvent& rCEvt) 69 { 70 // special code for non-VCL OS2/UNX removed 71 72 return FuDraw::Command( rCEvt ); 73 } 74 75 /************************************************************************* 76 |* 77 |* MouseButtonDown-event 78 |* 79 \************************************************************************/ 80 81 sal_Bool __EXPORT FuConstruct::MouseButtonDown(const MouseEvent& rMEvt) 82 { 83 // #95491# remember button state for creation of own MouseEvents 84 SetMouseButtonCode(rMEvt.GetButtons()); 85 86 sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt); 87 88 if ( pView->IsAction() ) 89 { 90 if ( rMEvt.IsRight() ) 91 pView->BckAction(); 92 return sal_True; 93 } 94 95 aDragTimer.Start(); 96 97 aMDPos = pWindow->PixelToLogic( rMEvt.GetPosPixel() ); 98 99 if ( rMEvt.IsLeft() ) 100 { 101 pWindow->CaptureMouse(); 102 103 SdrHdl* pHdl = pView->PickHandle(aMDPos); 104 105 if ( pHdl != NULL || pView->IsMarkedHit(aMDPos) ) 106 { 107 pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, 1); 108 bReturn = sal_True; 109 } 110 else if ( pView->AreObjectsMarked() ) 111 { 112 pView->UnmarkAll(); 113 bReturn = sal_True; 114 } 115 } 116 117 bIsInDragMode = sal_False; 118 119 return bReturn; 120 } 121 122 /************************************************************************* 123 |* 124 |* MouseMove-event 125 |* 126 \************************************************************************/ 127 128 sal_Bool __EXPORT FuConstruct::MouseMove(const MouseEvent& rMEvt) 129 { 130 FuDraw::MouseMove(rMEvt); 131 132 if (aDragTimer.IsActive() ) 133 { 134 Point aOldPixel = pWindow->LogicToPixel( aMDPos ); 135 Point aNewPixel = rMEvt.GetPosPixel(); 136 if ( Abs( aOldPixel.X() - aNewPixel.X() ) > SC_MAXDRAGMOVE || 137 Abs( aOldPixel.Y() - aNewPixel.Y() ) > SC_MAXDRAGMOVE ) 138 aDragTimer.Stop(); 139 } 140 141 Point aPix(rMEvt.GetPosPixel()); 142 Point aPnt( pWindow->PixelToLogic(aPix) ); 143 144 if ( pView->IsAction() ) 145 { 146 ForceScroll(aPix); 147 pView->MovAction(aPnt); 148 } 149 else 150 { 151 SdrHdl* pHdl=pView->PickHandle(aPnt); 152 153 if ( pHdl != NULL ) 154 { 155 pViewShell->SetActivePointer(pHdl->GetPointer()); 156 } 157 else if ( pView->IsMarkedHit(aPnt) ) 158 { 159 pViewShell->SetActivePointer(Pointer(POINTER_MOVE)); 160 } 161 else 162 { 163 pViewShell->SetActivePointer( aNewPointer ); 164 } 165 } 166 return sal_True; 167 } 168 169 /************************************************************************* 170 |* 171 |* MouseButtonUp-event 172 |* 173 \************************************************************************/ 174 175 sal_Bool __EXPORT FuConstruct::MouseButtonUp(const MouseEvent& rMEvt) 176 { 177 // #95491# remember button state for creation of own MouseEvents 178 SetMouseButtonCode(rMEvt.GetButtons()); 179 180 sal_Bool bReturn = SimpleMouseButtonUp( rMEvt ); 181 182 // Doppelklick auf Textobjekt? (->fusel) 183 184 sal_uInt16 nClicks = rMEvt.GetClicks(); 185 if ( nClicks == 2 && rMEvt.IsLeft() ) 186 { 187 if ( pView->AreObjectsMarked() ) 188 { 189 const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); 190 if (rMarkList.GetMarkCount() == 1) 191 { 192 SdrMark* pMark = rMarkList.GetMark(0); 193 SdrObject* pObj = pMark->GetMarkedSdrObj(); 194 195 // #49458# bei Uno-Controls nicht in Textmodus 196 if ( pObj->ISA(SdrTextObj) && !pObj->ISA(SdrUnoObj) ) 197 { 198 OutlinerParaObject* pOPO = pObj->GetOutlinerParaObject(); 199 sal_Bool bVertical = ( pOPO && pOPO->IsVertical() ); 200 sal_uInt16 nTextSlotId = bVertical ? SID_DRAW_TEXT_VERTICAL : SID_DRAW_TEXT; 201 202 pViewShell->GetViewData()->GetDispatcher(). 203 Execute(nTextSlotId, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); 204 205 // jetzt den erzeugten FuText holen und in den EditModus setzen 206 FuPoor* pPoor = pViewShell->GetViewData()->GetView()->GetDrawFuncPtr(); 207 if ( pPoor && pPoor->GetSlotID() == nTextSlotId ) // hat keine RTTI 208 { 209 FuText* pText = (FuText*)pPoor; 210 Point aMousePixel = rMEvt.GetPosPixel(); 211 pText->SetInEditMode( pObj, &aMousePixel ); 212 } 213 bReturn = sal_True; 214 } 215 } 216 } 217 } 218 219 FuDraw::MouseButtonUp(rMEvt); 220 221 return bReturn; 222 } 223 224 // SimpleMouseButtonUp - ohne Test auf Doppelklick 225 226 sal_Bool FuConstruct::SimpleMouseButtonUp(const MouseEvent& rMEvt) 227 { 228 sal_Bool bReturn = sal_True; 229 230 if (aDragTimer.IsActive() ) 231 { 232 aDragTimer.Stop(); 233 } 234 235 Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); 236 237 if ( pView->IsDragObj() ) 238 pView->EndDragObj( rMEvt.IsMod1() ); 239 240 else if ( pView->IsMarkObj() ) 241 pView->EndMarkObj(); 242 243 else bReturn = sal_False; 244 245 if ( !pView->IsAction() ) 246 { 247 pWindow->ReleaseMouse(); 248 249 if ( !pView->AreObjectsMarked() && rMEvt.GetClicks() < 2 ) 250 { 251 pView->MarkObj(aPnt, -2, sal_False, rMEvt.IsMod1()); 252 253 SfxDispatcher& rDisp = pViewShell->GetViewData()->GetDispatcher(); 254 if ( pView->AreObjectsMarked() ) 255 rDisp.Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); 256 else 257 rDisp.Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); 258 } 259 } 260 261 return bReturn; 262 } 263 264 /************************************************************************* 265 |* 266 |* Tastaturereignisse bearbeiten 267 |* 268 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls 269 |* FALSE. 270 |* 271 \************************************************************************/ 272 273 sal_Bool __EXPORT FuConstruct::KeyInput(const KeyEvent& rKEvt) 274 { 275 sal_Bool bReturn = sal_False; 276 277 switch ( rKEvt.GetKeyCode().GetCode() ) 278 { 279 case KEY_ESCAPE: 280 if ( pView->IsAction() ) 281 { 282 pView->BrkAction(); 283 pWindow->ReleaseMouse(); 284 bReturn = sal_True; 285 } 286 else // Zeichenmodus beenden 287 { 288 pViewShell->GetViewData()->GetDispatcher(). 289 Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); 290 } 291 break; 292 293 case KEY_DELETE: 294 pView->DeleteMarked(); 295 bReturn = sal_True; 296 break; 297 } 298 299 if ( !bReturn ) 300 { 301 bReturn = FuDraw::KeyInput(rKEvt); 302 } 303 304 return(bReturn); 305 } 306 307 /************************************************************************* 308 |* 309 |* Function aktivieren 310 |* 311 \************************************************************************/ 312 313 void FuConstruct::Activate() 314 { 315 FuDraw::Activate(); 316 } 317 318 /************************************************************************* 319 |* 320 |* Function deaktivieren 321 |* 322 \************************************************************************/ 323 324 void FuConstruct::Deactivate() 325 { 326 FuDraw::Deactivate(); 327 } 328 329 330 331 332