xref: /AOO41X/main/sc/source/ui/drawfunc/fuconpol.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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_sc.hxx"
26 
27 #include "fuconpol.hxx"
28 #include "tabvwsh.hxx"
29 #include "sc.hrc"
30 #include "drawview.hxx"
31 
32 // #98185# Create default drawing objects via keyboard
33 #include <svx/svdopath.hxx>
34 #include <basegfx/polygon/b2dpolygon.hxx>
35 #include <basegfx/point/b2dpoint.hxx>
36 
37 //  Pixelabstand zum Schliessen von Freihand-Zeichnungen
38 #ifndef CLOSE_PIXDIST
39 #define CLOSE_PIXDIST 5
40 #endif
41 
42 //------------------------------------------------------------------------
43 
44 /*************************************************************************
45 |*
46 |* Konstruktor
47 |*
48 \************************************************************************/
49 
FuConstPolygon(ScTabViewShell * pViewSh,Window * pWin,ScDrawView * pViewP,SdrModel * pDoc,SfxRequest & rReq)50 FuConstPolygon::FuConstPolygon(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP,
51                    SdrModel* pDoc, SfxRequest& rReq)
52     : FuConstruct(pViewSh, pWin, pViewP, pDoc, rReq)
53 {
54 }
55 
56 /*************************************************************************
57 |*
58 |* Destruktor
59 |*
60 \************************************************************************/
61 
~FuConstPolygon()62 FuConstPolygon::~FuConstPolygon()
63 {
64 }
65 
66 /*************************************************************************
67 |*
68 |* MouseButtonDown-event
69 |*
70 \************************************************************************/
71 
MouseButtonDown(const MouseEvent & rMEvt)72 sal_Bool __EXPORT FuConstPolygon::MouseButtonDown(const MouseEvent& rMEvt)
73 {
74     // #95491# remember button state for creation of own MouseEvents
75     SetMouseButtonCode(rMEvt.GetButtons());
76 
77     sal_Bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
78 
79     SdrViewEvent aVEvt;
80     (void)pView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt);
81     if (aVEvt.eEvent == SDREVENT_BEGTEXTEDIT)
82     {
83         // Texteingabe hier nicht zulassen
84         aVEvt.eEvent = SDREVENT_BEGDRAGOBJ;
85         pView->EnableExtendedMouseEventDispatcher(sal_False);
86     }
87     else
88     {
89         pView->EnableExtendedMouseEventDispatcher(sal_True);
90     }
91 
92     if ( pView->MouseButtonDown(rMEvt, pWindow) )
93         bReturn = sal_True;
94 
95     return bReturn;
96 }
97 
98 /*************************************************************************
99 |*
100 |* MouseMove-event
101 |*
102 \************************************************************************/
103 
MouseMove(const MouseEvent & rMEvt)104 sal_Bool __EXPORT FuConstPolygon::MouseMove(const MouseEvent& rMEvt)
105 {
106     pView->MouseMove(rMEvt, pWindow);
107     sal_Bool bReturn = FuConstruct::MouseMove(rMEvt);
108     return bReturn;
109 }
110 
111 /*************************************************************************
112 |*
113 |* MouseButtonUp-event
114 |*
115 \************************************************************************/
116 
MouseButtonUp(const MouseEvent & rMEvt)117 sal_Bool __EXPORT FuConstPolygon::MouseButtonUp(const MouseEvent& rMEvt)
118 {
119     // #95491# remember button state for creation of own MouseEvents
120     SetMouseButtonCode(rMEvt.GetButtons());
121 
122     sal_Bool bReturn = sal_False;
123     sal_Bool bSimple = sal_False;
124 
125     SdrViewEvent aVEvt;
126     (void)pView->PickAnything(rMEvt, SDRMOUSEBUTTONUP, aVEvt);
127 
128     pView->MouseButtonUp(rMEvt, pWindow);
129 
130     if (aVEvt.eEvent == SDREVENT_ENDCREATE)
131     {
132         bReturn = sal_True;
133         bSimple = sal_True;         // Doppelklick nicht weiterreichen
134     }
135 
136     sal_Bool bParent;
137     if (bSimple)
138         bParent = FuConstruct::SimpleMouseButtonUp(rMEvt);
139     else
140         bParent = FuConstruct::MouseButtonUp(rMEvt);
141 
142     return (bParent || bReturn);
143 }
144 
145 /*************************************************************************
146 |*
147 |* Tastaturereignisse bearbeiten
148 |*
149 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
150 |* FALSE.
151 |*
152 \************************************************************************/
153 
KeyInput(const KeyEvent & rKEvt)154 sal_Bool __EXPORT FuConstPolygon::KeyInput(const KeyEvent& rKEvt)
155 {
156     sal_Bool bReturn = FuConstruct::KeyInput(rKEvt);
157 
158     return(bReturn);
159 }
160 
161 /*************************************************************************
162 |*
163 |* Function aktivieren
164 |*
165 \************************************************************************/
166 
Activate()167 void FuConstPolygon::Activate()
168 {
169     pView->EnableExtendedMouseEventDispatcher(sal_True);
170 
171     SdrObjKind eKind;
172 
173     switch (GetSlotID())
174     {
175         case SID_DRAW_POLYGON_NOFILL:
176         case SID_DRAW_XPOLYGON_NOFILL:
177         {
178             eKind = OBJ_PLIN;
179         }
180         break;
181 
182         case SID_DRAW_POLYGON:
183         case SID_DRAW_XPOLYGON:
184         {
185             eKind = OBJ_POLY;
186         }
187         break;
188 
189         case SID_DRAW_BEZIER_NOFILL:
190         {
191             eKind = OBJ_PATHLINE;
192         }
193         break;
194 
195         case SID_DRAW_BEZIER_FILL:
196         {
197             eKind = OBJ_PATHFILL;
198         }
199         break;
200 
201         case SID_DRAW_FREELINE_NOFILL:
202         {
203             eKind = OBJ_FREELINE;
204         }
205         break;
206 
207         case SID_DRAW_FREELINE:
208         {
209             eKind = OBJ_FREEFILL;
210         }
211         break;
212 
213         default:
214         {
215             eKind = OBJ_PATHLINE;
216         }
217         break;
218     }
219 
220     pView->SetCurrentObj(sal::static_int_cast<sal_uInt16>(eKind));
221 
222     pView->SetEditMode(SDREDITMODE_CREATE);
223 
224     FuConstruct::Activate();
225 
226     aNewPointer = Pointer( POINTER_DRAW_POLYGON );
227     aOldPointer = pWindow->GetPointer();
228     pViewShell->SetActivePointer( aNewPointer );
229 }
230 
231 /*************************************************************************
232 |*
233 |* Function deaktivieren
234 |*
235 \************************************************************************/
236 
Deactivate()237 void FuConstPolygon::Deactivate()
238 {
239     pView->SetEditMode(SDREDITMODE_EDIT);
240 
241     pView->EnableExtendedMouseEventDispatcher(sal_False);
242 
243     FuConstruct::Deactivate();
244 
245     pViewShell->SetActivePointer( aOldPointer );
246 }
247 
248 // #98185# Create default drawing objects via keyboard
CreateDefaultObject(const sal_uInt16 nID,const Rectangle & rRectangle)249 SdrObject* FuConstPolygon::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
250 {
251     // case SID_DRAW_POLYGON:
252     // case SID_DRAW_POLYGON_NOFILL:
253     // case SID_DRAW_BEZIER_NOFILL:
254     // case SID_DRAW_FREELINE_NOFILL:
255 
256     SdrObject* pObj = SdrObjFactory::MakeNewObject(
257         pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(),
258         0L, pDrDoc);
259 
260     if(pObj)
261     {
262         if(pObj->ISA(SdrPathObj))
263         {
264             basegfx::B2DPolyPolygon aPoly;
265 
266             switch(nID)
267             {
268                 case SID_DRAW_BEZIER_NOFILL:
269                 {
270                     basegfx::B2DPolygon aInnerPoly;
271 
272                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
273 
274                     const basegfx::B2DPoint aCenterBottom(rRectangle.Center().X(), rRectangle.Bottom());
275                     aInnerPoly.appendBezierSegment(
276                         aCenterBottom,
277                         aCenterBottom,
278                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
279 
280                     const basegfx::B2DPoint aCenterTop(rRectangle.Center().X(), rRectangle.Top());
281                     aInnerPoly.appendBezierSegment(
282                         aCenterTop,
283                         aCenterTop,
284                         basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
285 
286                     aPoly.append(aInnerPoly);
287                     break;
288                 }
289                 case SID_DRAW_FREELINE_NOFILL:
290                 {
291                     basegfx::B2DPolygon aInnerPoly;
292 
293                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
294 
295                     aInnerPoly.appendBezierSegment(
296                         basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top()),
297                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Top()),
298                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Center().Y()));
299 
300                     aInnerPoly.appendBezierSegment(
301                         basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()),
302                         basegfx::B2DPoint(rRectangle.Right(), rRectangle.Bottom()),
303                         basegfx::B2DPoint(rRectangle.Right(), rRectangle.Top()));
304 
305                     aPoly.append(aInnerPoly);
306                     break;
307                 }
308                 case SID_DRAW_POLYGON:
309                 case SID_DRAW_POLYGON_NOFILL:
310                 {
311                     basegfx::B2DPolygon aInnerPoly;
312                     const sal_Int32 nWdt(rRectangle.GetWidth());
313                     const sal_Int32 nHgt(rRectangle.GetHeight());
314 
315                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Bottom()));
316                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 30) / 100, rRectangle.Top() + (nHgt * 70) / 100));
317                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left(), rRectangle.Top() + (nHgt * 15) / 100));
318                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 65) / 100, rRectangle.Top()));
319                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + nWdt, rRectangle.Top() + (nHgt * 30) / 100));
320                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 50) / 100));
321                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Left() + (nWdt * 80) / 100, rRectangle.Top() + (nHgt * 75) / 100));
322                     aInnerPoly.append(basegfx::B2DPoint(rRectangle.Bottom(), rRectangle.Right()));
323 
324                     if(SID_DRAW_POLYGON_NOFILL == nID)
325                     {
326                         aInnerPoly.append(basegfx::B2DPoint(rRectangle.Center().X(), rRectangle.Bottom()));
327                     }
328                     else
329                     {
330                         aInnerPoly.setClosed(true);
331                     }
332 
333                     aPoly.append(aInnerPoly);
334                     break;
335                 }
336             }
337 
338             ((SdrPathObj*)pObj)->SetPathPoly(aPoly);
339         }
340         else
341         {
342             DBG_ERROR("Object is NO path object");
343         }
344 
345         pObj->SetLogicRect(rRectangle);
346     }
347 
348     return pObj;
349 }
350 
351 // eof
352