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