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