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