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