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