xref: /aoo42x/main/sd/source/ui/func/fuconstr.cxx (revision 5b190011)
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_sd.hxx"
26 
27 #include "fuconstr.hxx"
28 
29 #include <svx/svxids.hrc>
30 #include <svl/aeitem.hxx>
31 #include <svx/svdpagv.hxx>
32 #include <svx/xdef.hxx>
33 #include <svx/xfillit0.hxx>
34 #include <sfx2/dispatch.hxx>
35 #include <sfx2/viewfrm.hxx>
36 
37 #include "app.hrc"
38 #include "glob.hrc"
39 #include "fudraw.hxx"
40 #include "View.hxx"
41 #include "Window.hxx"
42 #include "ViewShell.hxx"
43 #include "drawdoc.hxx"
44 #include "FrameView.hxx"
45 #include "sdpage.hxx"
46 #include "sdresid.hxx"
47 #include "stlpool.hxx"
48 #include <svx/globl3d.hxx>
49 
50 namespace sd {
51 
52 TYPEINIT1( FuConstruct, FuDraw );
53 
54 /*************************************************************************
55 |*
56 |* Konstruktor
57 |*
58 \************************************************************************/
59 
60 FuConstruct::FuConstruct (
61     ViewShell*		pViewSh,
62     ::sd::Window*			pWin,
63     ::sd::View*			pView,
64     SdDrawDocument*	pDoc,
65     SfxRequest&		rReq)
66     : FuDraw(pViewSh, pWin, pView, pDoc, rReq),
67       bSelectionChanged(sal_False)
68 {
69 }
70 
71 void FuConstruct::DoExecute( SfxRequest& rReq )
72 {
73 	FuDraw::DoExecute( rReq );
74 }
75 
76 /*************************************************************************
77 |*
78 |* MouseButtonDown-event
79 |*
80 \************************************************************************/
81 
82 sal_Bool FuConstruct::MouseButtonDown(const MouseEvent& rMEvt)
83 {
84 	sal_Bool bReturn = FuDraw::MouseButtonDown(rMEvt);
85 
86 	bMBDown = sal_True;
87 	bSelectionChanged = sal_False;
88 
89 	if ( mpView->IsAction() )
90 	{
91 		// #90235# this extra triggering is an error and leads to
92 		// erasing the last two points when creating a polygon.
93 		// if ( rMEvt.IsRight() )
94 		//	mpView->BckAction();
95 		return sal_True;
96 	}
97 
98 	bFirstMouseMove = sal_True;
99 	aDragTimer.Start();
100 
101 	aMDPos = mpWindow->PixelToLogic( rMEvt.GetPosPixel() );
102 	sal_uInt16 nHitLog = sal_uInt16 (mpWindow->PixelToLogic(Size(HITPIX,0)).Width());
103 
104 	if (rMEvt.IsLeft() && mpView->IsExtendedMouseEventDispatcherEnabled())
105 	{
106 		mpWindow->CaptureMouse();
107 
108 		SdrHdl* pHdl = mpView->PickHandle(aMDPos);
109 
110 		if ( pHdl != NULL || mpView->IsMarkedHit(aMDPos, nHitLog) )
111 		{
112 			sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
113 			mpView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl, nDrgLog);
114 			bReturn = sal_True;
115 		}
116 		else if ( mpView->AreObjectsMarked() )
117 		{
118 			mpView->UnmarkAll();
119 			bReturn = sal_True;
120 		}
121 	}
122 
123 	return bReturn;
124 }
125 
126 /*************************************************************************
127 |*
128 |* MouseMove-event
129 |*
130 \************************************************************************/
131 
132 sal_Bool FuConstruct::MouseMove(const MouseEvent& rMEvt)
133 {
134 	FuDraw::MouseMove(rMEvt);
135 
136 	if (aDragTimer.IsActive() )
137 	{
138 		if( bFirstMouseMove )
139 			bFirstMouseMove = sal_False;
140 		else
141 			aDragTimer.Stop();
142 	}
143 
144 	Point aPix(rMEvt.GetPosPixel());
145 	Point aPnt( mpWindow->PixelToLogic(aPix) );
146 
147 	if ( mpView->IsAction() )
148 	{
149 		ForceScroll(aPix);
150 		mpView->MovAction(aPnt);
151 	}
152 
153 	return sal_True;
154 }
155 
156 /*************************************************************************
157 |*
158 |* MouseButtonUp-event
159 |*
160 \************************************************************************/
161 
162 sal_Bool FuConstruct::MouseButtonUp(const MouseEvent& rMEvt)
163 {
164 	sal_Bool bReturn = sal_True;
165 
166 	if (aDragTimer.IsActive() )
167 	{
168 		aDragTimer.Stop();
169 		bIsInDragMode = sal_False;
170 	}
171 
172 	FuDraw::MouseButtonUp(rMEvt);
173 
174 	Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
175 
176 	if ( mpView && mpView->IsDragObj() )
177 	{
178 		FrameView* pFrameView = mpViewShell->GetFrameView();
179 		sal_Bool bDragWithCopy = (rMEvt.IsMod1() && pFrameView->IsDragWithCopy());
180 
181 		if (bDragWithCopy)
182 		{
183 			bDragWithCopy = !mpView->IsPresObjSelected(sal_False, sal_True);
184 		}
185 
186 		mpView->SetDragWithCopy(bDragWithCopy);
187 		mpView->EndDragObj( mpView->IsDragWithCopy() );
188 	}
189 	else if ( mpView && mpView->IsMarkObj() )
190 	{
191 		mpView->EndMarkObj();
192 	}
193 	else
194 	{
195 		bReturn = sal_False;
196 	}
197 
198 	if ( mpView &&  !mpView->IsAction() )
199 	{
200 		mpWindow->ReleaseMouse();
201 		sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
202 
203 		if ( !mpView->AreObjectsMarked() )
204 		{
205 			SdrObject* pObj;
206 			SdrPageView* pPV;
207 			sal_uInt16 nHitLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() );
208 
209 			if (!mpView->PickObj(aPnt, mpView->getHitTolLog(), pObj, pPV))
210 			{
211 				mpView->MarkObj(aPnt, nHitLog);
212 			}
213 
214 			mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
215 		}
216 		else if (rMEvt.IsLeft() && !rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() &&
217 				 !bSelectionChanged                   &&
218 				 Abs(aPnt.X() - aMDPos.X()) < nDrgLog &&
219 				 Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog)
220 		{
221 			/**************************************************************
222 			* Toggle zw. Selektion und Rotation
223 			**************************************************************/
224 			SdrObject* pSingleObj = NULL;
225 			sal_uLong nMarkCount = mpView->GetMarkedObjectList().GetMarkCount();
226 
227 			if (nMarkCount==1)
228 			{
229 				pSingleObj = mpView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
230 			}
231 
232 			if (mpView->GetDragMode() == SDRDRAG_MOVE && mpView->IsRotateAllowed() &&
233 				(mpViewShell->GetFrameView()->IsClickChangeRotation() ||
234 				 (pSingleObj && pSingleObj->GetObjInventor()==E3dInventor)))
235 			{
236 				mpView->SetDragMode(SDRDRAG_ROTATE);
237 			}
238 			else
239 			{
240 				mpView->SetDragMode(SDRDRAG_MOVE);
241 			}
242 		}
243 	}
244 
245 	sal_uInt16 nClicks = rMEvt.GetClicks();
246 
247 	if (nClicks == 2 && rMEvt.IsLeft() && bMBDown &&
248 		!rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift() )
249 	{
250 		DoubleClick(rMEvt);
251 	}
252 	bMBDown = sal_False;
253 
254 	return bReturn;
255 }
256 
257 /*************************************************************************
258 |*
259 |* Tastaturereignisse bearbeiten
260 |*
261 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
262 |* sal_False.
263 |*
264 \************************************************************************/
265 
266 sal_Bool FuConstruct::KeyInput(const KeyEvent& rKEvt)
267 {
268 	sal_Bool bReturn = sal_False;
269 
270 	if ( !bReturn )
271 		bReturn = FuDraw::KeyInput(rKEvt);
272 
273 	return(bReturn);
274 }
275 
276 /*************************************************************************
277 |*
278 |* Function aktivieren
279 |*
280 \************************************************************************/
281 
282 void FuConstruct::Activate()
283 {
284 	mpView->SetEditMode(SDREDITMODE_CREATE);
285 	FuDraw::Activate();
286 }
287 
288 /*************************************************************************
289 |*
290 |* Function deaktivieren
291 |*
292 \************************************************************************/
293 
294 void FuConstruct::Deactivate()
295 {
296 	FuDraw::Deactivate();
297 	mpView->SetEditMode(SDREDITMODE_EDIT);
298 }
299 
300 /*************************************************************************
301 |*
302 |* StyleSheet fuer das zu erzeugende Objekt setzen
303 |*
304 \************************************************************************/
305 
306 void FuConstruct::SetStyleSheet(SfxItemSet& rAttr, SdrObject* pObj)
307 {
308 	sal_Bool bUseFillStyle, bUseNoFillStyle;
309 	bUseFillStyle = bUseNoFillStyle = sal_False;
310 
311 	switch( nSlotId )
312 	{
313 	case SID_DRAW_RECT:
314 	case SID_DRAW_RECT_ROUND:
315 	case SID_DRAW_SQUARE:
316 	case SID_DRAW_SQUARE_ROUND:
317 	case SID_DRAW_ELLIPSE:
318 	case SID_DRAW_PIE:
319 	case SID_DRAW_ELLIPSECUT:
320 	case SID_DRAW_CIRCLE:
321 	case SID_DRAW_CIRCLEPIE:
322 	case SID_DRAW_CIRCLECUT:
323 	case SID_DRAW_POLYGON:
324 	case SID_DRAW_XPOLYGON:
325 	case SID_DRAW_FREELINE:
326 	case SID_DRAW_BEZIER_FILL:
327 	{
328 		bUseFillStyle = sal_True;
329 		break;
330 	}
331 	case  SID_DRAW_RECT_NOFILL:
332 	case SID_DRAW_RECT_ROUND_NOFILL:
333 	case SID_DRAW_SQUARE_NOFILL:
334 	case SID_DRAW_SQUARE_ROUND_NOFILL:
335 	case SID_DRAW_ELLIPSE_NOFILL:
336 	case SID_DRAW_PIE_NOFILL:
337 	case SID_DRAW_ELLIPSECUT_NOFILL:
338 	case SID_DRAW_CIRCLE_NOFILL:
339 	case SID_DRAW_CIRCLEPIE_NOFILL:
340 	case SID_DRAW_CIRCLECUT_NOFILL:
341 	case SID_DRAW_POLYGON_NOFILL:
342 	case SID_DRAW_XPOLYGON_NOFILL:
343 	case SID_DRAW_FREELINE_NOFILL:
344 	case SID_DRAW_LINE:
345 	case SID_DRAW_XLINE:
346 	case SID_CONNECTOR_ARROW_START:
347 	case SID_CONNECTOR_ARROW_END:
348 	case SID_CONNECTOR_ARROWS:
349 	case SID_CONNECTOR_CIRCLE_START:
350 	case SID_CONNECTOR_CIRCLE_END:
351 	case SID_CONNECTOR_CIRCLES:
352 	case SID_CONNECTOR_LINE:
353 	case SID_CONNECTOR_LINE_ARROW_START:
354 	case SID_CONNECTOR_LINE_ARROW_END:
355 	case SID_CONNECTOR_LINE_ARROWS:
356 	case SID_CONNECTOR_LINE_CIRCLE_START:
357 	case SID_CONNECTOR_LINE_CIRCLE_END:
358 	case SID_CONNECTOR_LINE_CIRCLES:
359 	case SID_CONNECTOR_CURVE:
360 	case SID_CONNECTOR_CURVE_ARROW_START:
361 	case SID_CONNECTOR_CURVE_ARROW_END:
362 	case SID_CONNECTOR_CURVE_ARROWS:
363 	case SID_CONNECTOR_CURVE_CIRCLE_START:
364 	case SID_CONNECTOR_CURVE_CIRCLE_END:
365 	case SID_CONNECTOR_CURVE_CIRCLES:
366 	case SID_CONNECTOR_LINES:
367 	case SID_CONNECTOR_LINES_ARROW_START:
368 	case SID_CONNECTOR_LINES_ARROW_END:
369 	case SID_CONNECTOR_LINES_ARROWS:
370 	case SID_CONNECTOR_LINES_CIRCLE_START:
371 	case SID_CONNECTOR_LINES_CIRCLE_END:
372 	case SID_CONNECTOR_LINES_CIRCLES:
373 	case SID_DRAW_BEZIER_NOFILL:
374 	case SID_LINE_ARROW_END:
375 	{
376 		bUseNoFillStyle = sal_True;
377 		break;
378 	}
379 	}
380 	SetStyleSheet( rAttr, pObj, bUseFillStyle, bUseNoFillStyle );
381 }
382 
383 void FuConstruct::SetStyleSheet( SfxItemSet& rAttr, SdrObject* pObj,
384 		const sal_Bool bForceFillStyle, const sal_Bool bForceNoFillStyle )
385 {
386 	SdPage* pPage = (SdPage*)mpView->GetSdrPageView()->GetPage();
387 	if ( pPage->IsMasterPage() && pPage->GetPageKind() == PK_STANDARD &&
388 	     mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
389 	{
390 		/**********************************************
391 		* Objects was created on the slide master page
392 		***********************************************/
393 		String aName( pPage->GetLayoutName() );
394 		String aSep = UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ) );
395 		sal_uInt16 n = aName.Search(aSep);
396 		n = n + aSep.Len();
397 		aName.Erase(n);
398 		aName.Append( String ( SdResId( STR_LAYOUT_BACKGROUNDOBJECTS ) ) );
399 		SfxStyleSheet* pSheet = (SfxStyleSheet*)pPage->GetModel()->
400 												GetStyleSheetPool()->
401 												Find(aName, SD_STYLE_FAMILY_MASTERPAGE);
402 		DBG_ASSERT(pSheet, "Objektvorlage nicht gefunden");
403 		if (pSheet)
404 		{
405 			// applying style sheet for background objects
406 			pObj->SetStyleSheet(pSheet, sal_False);
407 			SfxItemSet& rSet = pSheet->GetItemSet();
408 			const XFillStyleItem& rFillStyle = (const XFillStyleItem&)rSet.Get(XATTR_FILLSTYLE);
409 			if ( bForceFillStyle )
410 			{
411 				if (rFillStyle.GetValue() == XFILL_NONE)
412 					rAttr.Put(XFillStyleItem(XFILL_SOLID));
413 			}
414 			else if ( bForceNoFillStyle )
415 			{
416 				if (rFillStyle.GetValue() != XFILL_NONE)
417 					rAttr.Put(XFillStyleItem(XFILL_NONE));
418 			}
419 		}
420 	}
421 	else
422 	{
423 		/***********************************
424 		* object was created on normal page
425 		************************************/
426 		if ( bForceNoFillStyle )
427 		{
428 			String aName(SdResId(STR_POOLSHEET_OBJWITHOUTFILL));
429 			SfxStyleSheet* pSheet = (SfxStyleSheet*)pPage->GetModel()->
430 										 GetStyleSheetPool()->
431 										 Find(aName, SD_STYLE_FAMILY_GRAPHICS);
432 			DBG_ASSERT(pSheet, "Objektvorlage nicht gefunden");
433 			if (pSheet)
434 			{
435 				pObj->SetStyleSheet(pSheet, sal_False);
436 				SfxItemSet aAttr(*mpView->GetDefaultAttr().Clone());
437 				aAttr.Put(pSheet->GetItemSet().Get(XATTR_FILLSTYLE));
438 				pObj->SetMergedItemSet(aAttr);
439 			}
440 			else
441 			{
442 				SfxItemSet aAttr(*mpView->GetDefaultAttr().Clone());
443 				rAttr.Put(XFillStyleItem(XFILL_NONE));
444 				pObj->SetMergedItemSet(aAttr);
445 			}
446 		}
447 	}
448 }
449 
450 } // end of namespace sd
451