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