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 <svx/svditer.hxx> 29 #include <svx/svdobj.hxx> 30 #include <svx/svdpagv.hxx> 31 32 #include "fupoor.hxx" 33 #include "tabvwsh.hxx" 34 #include "drawview.hxx" 35 #include "detfunc.hxx" 36 #include "document.hxx" 37 #include <vcl/svapp.hxx> 38 #include <svx/sdrhittesthelper.hxx> 39 40 /************************************************************************* 41 |* 42 |* Konstruktor 43 |* 44 \************************************************************************/ 45 46 FuPoor::FuPoor(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, 47 SdrModel* pDoc, SfxRequest& rReq) : 48 pView(pViewP), 49 pViewShell(pViewSh), 50 pWindow(pWin), 51 pDrDoc(pDoc), 52 aSfxRequest(rReq), 53 pDialog(NULL), 54 bIsInDragMode(sal_False), 55 // #95491# remember MouseButton state 56 mnCode(0) 57 { 58 aScrollTimer.SetTimeoutHdl( LINK(this, FuPoor, ScrollHdl) ); 59 aScrollTimer.SetTimeout(SELENG_AUTOREPEAT_INTERVAL); 60 61 aDragTimer.SetTimeoutHdl( LINK(this, FuPoor, DragTimerHdl) ); 62 aDragTimer.SetTimeout(SELENG_DRAGDROP_TIMEOUT); 63 } 64 65 /************************************************************************* 66 |* 67 |* Destruktor 68 |* 69 \************************************************************************/ 70 71 FuPoor::~FuPoor() 72 { 73 aDragTimer.Stop(); 74 aScrollTimer.Stop(); 75 76 if (pDialog) 77 delete pDialog; 78 } 79 80 /************************************************************************* 81 |* 82 |* Function aktivieren 83 |* 84 \************************************************************************/ 85 86 void FuPoor::Activate() 87 { 88 if (pDialog) 89 { 90 pDialog->Show(); 91 } 92 } 93 94 /************************************************************************* 95 |* 96 |* Function deaktivieren 97 |* 98 \************************************************************************/ 99 100 void FuPoor::Deactivate() 101 { 102 aDragTimer.Stop(); 103 aScrollTimer.Stop(); 104 105 if (pDialog) 106 { 107 pDialog->Hide(); 108 } 109 } 110 111 /************************************************************************* 112 |* 113 |* Scrollen bei Erreichen des Fensterrandes; wird von 114 |* MouseMove aufgerufen 115 |* 116 \************************************************************************/ 117 118 void FuPoor::ForceScroll(const Point& aPixPos) 119 { 120 aScrollTimer.Stop(); 121 122 Size aSize = pWindow->GetSizePixel(); 123 SCsCOL dx = 0; 124 SCsROW dy = 0; 125 126 if ( aPixPos.X() <= 0 ) dx = -1; 127 if ( aPixPos.X() >= aSize.Width() ) dx = 1; 128 if ( aPixPos.Y() <= 0 ) dy = -1; 129 if ( aPixPos.Y() >= aSize.Height() ) dy = 1; 130 131 ScViewData* pViewData = pViewShell->GetViewData(); 132 if ( pViewData->GetDocument()->IsNegativePage( pViewData->GetTabNo() ) ) 133 dx = -dx; 134 135 ScSplitPos eWhich = pViewData->GetActivePart(); 136 if ( dx > 0 && pViewData->GetHSplitMode() == SC_SPLIT_FIX && WhichH(eWhich) == SC_SPLIT_LEFT ) 137 { 138 pViewShell->ActivatePart( ( eWhich == SC_SPLIT_TOPLEFT ) ? 139 SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT ); 140 dx = 0; 141 } 142 if ( dy > 0 && pViewData->GetVSplitMode() == SC_SPLIT_FIX && WhichV(eWhich) == SC_SPLIT_TOP ) 143 { 144 pViewShell->ActivatePart( ( eWhich == SC_SPLIT_TOPLEFT ) ? 145 SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT ); 146 dy = 0; 147 } 148 149 if ( dx != 0 || dy != 0 ) 150 { 151 ScrollStart(); // Scrollaktion in abgeleiteter Klasse 152 pViewShell->ScrollLines(2*dx, 4*dy); 153 ScrollEnd(); 154 aScrollTimer.Start(); 155 } 156 } 157 158 /************************************************************************* 159 |* 160 |* Timer-Handler fuer Fensterscrolling 161 |* 162 \************************************************************************/ 163 164 IMPL_LINK_INLINE_START( FuPoor, ScrollHdl, Timer *, EMPTYARG ) 165 { 166 Point aPosPixel = pWindow->GetPointerPosPixel(); 167 168 // #95491# use remembered MouseButton state to create correct 169 // MouseEvents for this artifical MouseMove. 170 MouseMove(MouseEvent(aPosPixel, 1, 0, GetMouseButtonCode())); 171 172 return 0; 173 } 174 IMPL_LINK_INLINE_END( FuPoor, ScrollHdl, Timer *, pTimer ) 175 176 // #95491# moved from inline to *.cxx 177 sal_Bool FuPoor::MouseButtonUp(const MouseEvent& rMEvt) 178 { 179 // #95491# remember button state for creation of own MouseEvents 180 SetMouseButtonCode(rMEvt.GetButtons()); 181 182 return sal_False; 183 } 184 185 // #95491# moved from inline to *.cxx 186 sal_Bool FuPoor::MouseButtonDown(const MouseEvent& rMEvt) 187 { 188 // #95491# remember button state for creation of own MouseEvents 189 SetMouseButtonCode(rMEvt.GetButtons()); 190 191 return sal_False; 192 } 193 194 /************************************************************************* 195 |* 196 |* String in Applikations-Statuszeile ausgeben 197 |* 198 \************************************************************************/ 199 200 // WriteStatus gibt's nicht mehr 201 202 /************************************************************************* 203 |* 204 |* Tastaturereignisse bearbeiten 205 |* 206 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls 207 |* FALSE. 208 |* 209 \************************************************************************/ 210 211 sal_Bool FuPoor::KeyInput(const KeyEvent& /* rKEvt */) 212 { 213 sal_Bool bReturn = sal_False; 214 215 return(bReturn); 216 } 217 218 sal_uInt8 FuPoor::Command(const CommandEvent& rCEvt) 219 { 220 if ( COMMAND_STARTDRAG == rCEvt.GetCommand() ) 221 { 222 //!!! sollte Joe eigentlich machen: 223 // nur, wenn im Outliner was selektiert ist, darf 224 // Command sal_True zurueckliefern: 225 226 OutlinerView* pOutView = pView->GetTextEditOutlinerView(); 227 228 if ( pOutView ) 229 return pOutView->HasSelection() ? pView->Command(rCEvt,pWindow) : SC_CMD_NONE; 230 else 231 return pView->Command(rCEvt,pWindow); 232 } 233 else 234 return pView->Command(rCEvt,pWindow); 235 } 236 237 /************************************************************************* 238 |* 239 |* Cut object to clipboard 240 |* 241 \************************************************************************/ 242 243 void FuPoor::DoCut() 244 { 245 if (pView) 246 { 247 //! pView->DoCut(pWindow); 248 } 249 } 250 251 /************************************************************************* 252 |* 253 |* Copy object to clipboard 254 |* 255 \************************************************************************/ 256 257 void FuPoor::DoCopy() 258 { 259 if (pView) 260 { 261 //! pView->DoCopy(pWindow); 262 } 263 } 264 265 /************************************************************************* 266 |* 267 |* Paste object from clipboard 268 |* 269 \************************************************************************/ 270 271 void FuPoor::DoPaste() 272 { 273 if (pView) 274 { 275 //! pView->DoPaste(pWindow); 276 } 277 } 278 279 /************************************************************************* 280 |* 281 |* Timer-Handler fuer Drag&Drop 282 |* 283 \************************************************************************/ 284 285 IMPL_LINK( FuPoor, DragTimerHdl, Timer *, EMPTYARG ) 286 { 287 // ExecuteDrag (und das damit verbundene Reschedule) direkt aus dem Timer 288 // aufzurufen, bringt die VCL-Timer-Verwaltung durcheinander, wenn dabei 289 // (z.B. im Drop) wieder ein Timer gestartet wird (z.B. ComeBack-Timer der 290 // DrawView fuer Solid Handles / ModelHasChanged) - der neue Timer laeuft 291 // dann um die Dauer des Drag&Drop zu spaet ab. 292 // Darum Drag&Drop aus eigenem Event: 293 294 Application::PostUserEvent( LINK( this, FuPoor, DragHdl ) ); 295 return 0; 296 } 297 298 IMPL_LINK( FuPoor, DragHdl, void *, EMPTYARG ) 299 { 300 SdrHdl* pHdl = pView->PickHandle(aMDPos); 301 302 if ( pHdl==NULL && pView->IsMarkedHit(aMDPos) ) 303 { 304 pWindow->ReleaseMouse(); 305 bIsInDragMode = sal_True; 306 307 // pView->BeginDrag(pWindow, aMDPos); 308 pViewShell->GetScDrawView()->BeginDrag(pWindow, aMDPos); 309 } 310 return 0; 311 } 312 313 // Detektiv-Linie 314 315 sal_Bool FuPoor::IsDetectiveHit( const Point& rLogicPos ) 316 { 317 SdrPageView* pPV = pView->GetSdrPageView(); 318 if (!pPV) 319 return sal_False; 320 321 sal_Bool bFound = sal_False; 322 SdrObjListIter aIter( *pPV->GetObjList(), IM_FLAT ); 323 SdrObject* pObject = aIter.Next(); 324 while (pObject && !bFound) 325 { 326 if (ScDetectiveFunc::IsNonAlienArrow( pObject )) 327 { 328 sal_uInt16 nHitLog = (sal_uInt16) pWindow->PixelToLogic( 329 Size(pView->GetHitTolerancePixel(),0)).Width(); 330 if(SdrObjectPrimitiveHit(*pObject, rLogicPos, nHitLog, *pPV, 0, false)) 331 { 332 bFound = sal_True; 333 } 334 } 335 336 pObject = aIter.Next(); 337 } 338 return bFound; 339 } 340 341 void FuPoor::StopDragTimer() 342 { 343 if (aDragTimer.IsActive() ) 344 aDragTimer.Stop(); 345 } 346 347 /************************************************************************* 348 |* 349 |* #98185# Create default drawing objects via keyboard 350 |* 351 \************************************************************************/ 352 353 SdrObject* FuPoor::CreateDefaultObject(const sal_uInt16 /* nID */, const Rectangle& /* rRectangle */) 354 { 355 // empty base implementation 356 return 0L; 357 } 358 359 void FuPoor::ImpForceQuadratic(Rectangle& rRect) 360 { 361 if(rRect.GetWidth() > rRect.GetHeight()) 362 { 363 rRect = Rectangle( 364 Point(rRect.Left() + ((rRect.GetWidth() - rRect.GetHeight()) / 2), rRect.Top()), 365 Size(rRect.GetHeight(), rRect.GetHeight())); 366 } 367 else 368 { 369 rRect = Rectangle( 370 Point(rRect.Left(), rRect.Top() + ((rRect.GetHeight() - rRect.GetWidth()) / 2)), 371 Size(rRect.GetWidth(), rRect.GetWidth())); 372 } 373 } 374 375 // #i33136# 376 bool FuPoor::doConstructOrthogonal() const 377 { 378 return false; 379 } 380 381 // eof 382