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 "fuconrec.hxx"
28 #include <svx/svdpagv.hxx>
29
30
31 #include <svx/svxids.hrc>
32 #include <svx/dialogs.hrc>
33 #include <svx/dialmgr.hxx>
34
35 #include "app.hrc"
36 #include <svl/aeitem.hxx>
37 #include <svx/xlnstwit.hxx>
38 #include <svx/xlnedwit.hxx>
39 #include <svx/xlnedit.hxx>
40 #include <svx/xlnstit.hxx>
41 #include <svx/xlnwtit.hxx>
42 #include <sfx2/viewfrm.hxx>
43 #include <svx/sdtmfitm.hxx>
44 #include <svx/sxekitm.hxx>
45 #include <svx/sderitm.hxx>
46 #include <sfx2/dispatch.hxx>
47 #include <svx/svdopath.hxx>
48 #include <svx/svdocirc.hxx>
49 #include <svl/intitem.hxx>
50 #include <sfx2/request.hxx>
51 #include <editeng/adjitem.hxx>
52 #include <svx/xtable.hxx>
53
54 // #88751#
55 #include <svx/svdocapt.hxx>
56
57 // #97016#
58 #include <svx/svdomeas.hxx>
59 #include "ViewShell.hxx"
60 #include "ViewShellBase.hxx"
61 #include "ToolBarManager.hxx"
62 // #109583#
63 #include <editeng/writingmodeitem.hxx>
64 #include <basegfx/polygon/b2dpolygontools.hxx>
65 #include <basegfx/polygon/b2dpolygon.hxx>
66
67 #include "sdresid.hxx"
68 #include "View.hxx"
69 #include "sdpage.hxx"
70 #include "Window.hxx"
71 #include "stlpool.hxx"
72 #include "drawdoc.hxx"
73 #include "res_bmp.hrc"
74 #include "glob.hrc"
75
76 namespace sd {
77
78 TYPEINIT1( FuConstructRectangle, FuConstruct );
79
80 /*************************************************************************
81 |*
82 |* Konstruktor
83 |*
84 \************************************************************************/
85
FuConstructRectangle(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)86 FuConstructRectangle::FuConstructRectangle (
87 ViewShell* pViewSh,
88 ::sd::Window* pWin,
89 ::sd::View* pView,
90 SdDrawDocument* pDoc,
91 SfxRequest& rReq)
92 : FuConstruct(pViewSh, pWin, pView, pDoc, rReq)
93 {
94 }
95
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq,bool bPermanent)96 FunctionReference FuConstructRectangle::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq, bool bPermanent )
97 {
98 FuConstructRectangle* pFunc;
99 FunctionReference xFunc( pFunc = new FuConstructRectangle( pViewSh, pWin, pView, pDoc, rReq ) );
100 xFunc->DoExecute(rReq);
101 pFunc->SetPermanent(bPermanent);
102 return xFunc;
103 }
104
DoExecute(SfxRequest & rReq)105 void FuConstructRectangle::DoExecute( SfxRequest& rReq )
106 {
107 FuConstruct::DoExecute( rReq );
108
109 mpViewShell->GetViewShellBase().GetToolBarManager()->SetToolBar(
110 ToolBarManager::TBG_FUNCTION,
111 ToolBarManager::msDrawingObjectToolBar);
112
113 const SfxItemSet *pArgs = rReq.GetArgs ();
114
115 if (pArgs)
116 {
117 switch (nSlotId)
118 {
119 case SID_DRAW_ELLIPSE :
120 {
121 SFX_REQUEST_ARG (rReq, pCenterX, SfxUInt32Item, ID_VAL_CENTER_X, sal_False);
122 SFX_REQUEST_ARG (rReq, pCenterY, SfxUInt32Item, ID_VAL_CENTER_Y, sal_False);
123 SFX_REQUEST_ARG (rReq, pAxisX, SfxUInt32Item, ID_VAL_AXIS_X, sal_False);
124 SFX_REQUEST_ARG (rReq, pAxisY, SfxUInt32Item, ID_VAL_AXIS_Y, sal_False);
125
126 Rectangle aNewRectangle (pCenterX->GetValue () - pAxisX->GetValue () / 2,
127 pCenterY->GetValue () - pAxisY->GetValue () / 2,
128 pCenterX->GetValue () + pAxisX->GetValue () / 2,
129 pCenterY->GetValue () + pAxisY->GetValue () / 2);
130 SdrCircObj *pNewCircle = new SdrCircObj (OBJ_CIRC, aNewRectangle);
131 SdrPageView *pPV = mpView->GetSdrPageView();
132
133 mpView->InsertObjectAtView(pNewCircle, *pPV, SDRINSERT_SETDEFLAYER | SDRINSERT_SETDEFATTR);
134 }
135 break;
136
137 case SID_DRAW_RECT :
138 {
139 SFX_REQUEST_ARG (rReq, pMouseStartX, SfxUInt32Item, ID_VAL_MOUSESTART_X, sal_False);
140 SFX_REQUEST_ARG (rReq, pMouseStartY, SfxUInt32Item, ID_VAL_MOUSESTART_Y, sal_False);
141 SFX_REQUEST_ARG (rReq, pMouseEndX, SfxUInt32Item, ID_VAL_MOUSEEND_X, sal_False);
142 SFX_REQUEST_ARG (rReq, pMouseEndY, SfxUInt32Item, ID_VAL_MOUSEEND_Y, sal_False);
143
144 Rectangle aNewRectangle (pMouseStartX->GetValue (),
145 pMouseStartY->GetValue (),
146 pMouseEndX->GetValue (),
147 pMouseEndY->GetValue ());
148 SdrRectObj *pNewRect = new SdrRectObj (aNewRectangle);
149 SdrPageView *pPV = mpView->GetSdrPageView();
150
151 mpView->InsertObjectAtView(pNewRect, *pPV, SDRINSERT_SETDEFLAYER | SDRINSERT_SETDEFATTR);
152 }
153 break;
154 }
155 }
156
157 if (nSlotId == SID_TOOL_CONNECTOR ||
158 nSlotId == SID_CONNECTOR_ARROW_START ||
159 nSlotId == SID_CONNECTOR_ARROW_END ||
160 nSlotId == SID_CONNECTOR_ARROWS ||
161 nSlotId == SID_CONNECTOR_CIRCLE_START ||
162 nSlotId == SID_CONNECTOR_CIRCLE_END ||
163 nSlotId == SID_CONNECTOR_CIRCLES ||
164 nSlotId == SID_CONNECTOR_LINE ||
165 nSlotId == SID_CONNECTOR_LINE_ARROW_START ||
166 nSlotId == SID_CONNECTOR_LINE_ARROW_END ||
167 nSlotId == SID_CONNECTOR_LINE_ARROWS ||
168 nSlotId == SID_CONNECTOR_LINE_CIRCLE_START ||
169 nSlotId == SID_CONNECTOR_LINE_CIRCLE_END ||
170 nSlotId == SID_CONNECTOR_LINE_CIRCLES ||
171 nSlotId == SID_CONNECTOR_CURVE ||
172 nSlotId == SID_CONNECTOR_CURVE_ARROW_START ||
173 nSlotId == SID_CONNECTOR_CURVE_ARROW_END ||
174 nSlotId == SID_CONNECTOR_CURVE_ARROWS ||
175 nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START ||
176 nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END ||
177 nSlotId == SID_CONNECTOR_CURVE_CIRCLES ||
178 nSlotId == SID_CONNECTOR_LINES ||
179 nSlotId == SID_CONNECTOR_LINES_ARROW_START ||
180 nSlotId == SID_CONNECTOR_LINES_ARROW_END ||
181 nSlotId == SID_CONNECTOR_LINES_ARROWS ||
182 nSlotId == SID_CONNECTOR_LINES_CIRCLE_START ||
183 nSlotId == SID_CONNECTOR_LINES_CIRCLE_END ||
184 nSlotId == SID_CONNECTOR_LINES_CIRCLES ||
185 nSlotId == SID_LINE_ARROW_START ||
186 nSlotId == SID_LINE_ARROW_END ||
187 nSlotId == SID_LINE_ARROWS ||
188 nSlotId == SID_LINE_ARROW_CIRCLE ||
189 nSlotId == SID_LINE_CIRCLE_ARROW ||
190 nSlotId == SID_LINE_ARROW_SQUARE ||
191 nSlotId == SID_LINE_SQUARE_ARROW )
192 {
193 mpView->UnmarkAll();
194 }
195 }
196
197 /*************************************************************************
198 |*
199 |* MouseButtonDown-event
200 |*
201 \************************************************************************/
202
MouseButtonDown(const MouseEvent & rMEvt)203 sal_Bool FuConstructRectangle::MouseButtonDown(const MouseEvent& rMEvt)
204 {
205 sal_Bool bReturn = FuConstruct::MouseButtonDown(rMEvt);
206
207 if ( rMEvt.IsLeft() && !mpView->IsAction() )
208 {
209 Point aPnt( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) );
210
211 mpWindow->CaptureMouse();
212 sal_uInt16 nDrgLog = sal_uInt16 ( mpWindow->PixelToLogic(Size(DRGPIX,0)).Width() );
213
214 if (mpView->GetCurrentObjIdentifier() == OBJ_CAPTION)
215 {
216 Size aCaptionSize(846, 846); // (4x2)cm
217 bReturn = mpView->BegCreateCaptionObj(aPnt, aCaptionSize,
218 (OutputDevice*) NULL, nDrgLog);
219 }
220 else
221 {
222 mpView->BegCreateObj(aPnt, (OutputDevice*) NULL, nDrgLog);
223 }
224
225 SdrObject* pObj = mpView->GetCreateObj();
226
227 if (pObj)
228 {
229 SfxItemSet aAttr(mpDoc->GetPool());
230 SetStyleSheet(aAttr, pObj);
231 SetAttributes(aAttr, pObj);
232 SetLineEnds(aAttr, pObj);
233 pObj->SetMergedItemSet(aAttr);
234
235 if( nSlotId == SID_DRAW_CAPTION_VERTICAL )
236 ( (SdrTextObj*) pObj)->SetVerticalWriting( sal_True );
237 }
238 }
239 return bReturn;
240 }
241
242 /*************************************************************************
243 |*
244 |* MouseMove-event
245 |*
246 \************************************************************************/
247
MouseMove(const MouseEvent & rMEvt)248 sal_Bool FuConstructRectangle::MouseMove(const MouseEvent& rMEvt)
249 {
250 return FuConstruct::MouseMove(rMEvt);
251 }
252
253 /*************************************************************************
254 |*
255 |* MouseButtonUp-event
256 |*
257 \************************************************************************/
258
MouseButtonUp(const MouseEvent & rMEvt)259 sal_Bool FuConstructRectangle::MouseButtonUp(const MouseEvent& rMEvt)
260 {
261 sal_Bool bReturn(sal_False);
262
263 if(mpView->IsCreateObj() && rMEvt.IsLeft())
264 {
265 SdrObject* pObj = mpView->GetCreateObj();
266
267 if(pObj && mpView->EndCreateObj(SDRCREATE_FORCEEND))
268 {
269 if(SID_DRAW_MEASURELINE == nSlotId)
270 {
271 SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin();
272 String aStr(SdResId(STR_LAYER_MEASURELINES));
273 pObj->SetLayer(rAdmin.GetLayerID(aStr, sal_False));
274 }
275
276 // #88751# init text position when vertica caption object is created
277 if(pObj->ISA(SdrCaptionObj) && SID_DRAW_CAPTION_VERTICAL == nSlotId)
278 {
279 // draw text object, needs to be initialized when vertical text is used
280 SfxItemSet aSet(pObj->GetMergedItemSet());
281
282 aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER));
283 aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
284
285 // #109583#
286 // Correct the value of SDRATTR_TEXTDIRECTION to avoid SetItemSet
287 // calling SetVerticalWriting() again since this item may not yet
288 // be set at the object and thus may differ from verical state of
289 // the object.
290 aSet.Put(SvxWritingModeItem(com::sun::star::text::WritingMode_TB_RL, SDRATTR_TEXTDIRECTION));
291 pObj->SetMergedItemSet(aSet);
292 }
293
294 bReturn = sal_True;
295 }
296 }
297
298 bReturn = FuConstruct::MouseButtonUp (rMEvt) || bReturn;
299
300 if (!bPermanent)
301 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
302
303 return bReturn;
304 }
305
306 /*************************************************************************
307 |*
308 |* Tastaturereignisse bearbeiten
309 |*
310 |* Wird ein KeyEvent bearbeitet, so ist der Return-Wert sal_True, andernfalls
311 |* sal_False.
312 |*
313 \************************************************************************/
314
KeyInput(const KeyEvent & rKEvt)315 sal_Bool FuConstructRectangle::KeyInput(const KeyEvent& rKEvt)
316 {
317 sal_Bool bReturn = FuConstruct::KeyInput(rKEvt);
318 return(bReturn);
319 }
320
321 /*************************************************************************
322 |*
323 |* Function aktivieren
324 |*
325 \************************************************************************/
326
Activate()327 void FuConstructRectangle::Activate()
328 {
329 SdrObjKind aObjKind;
330
331 switch (nSlotId)
332 {
333 case SID_LINE_ARROW_START:
334 case SID_LINE_ARROW_END:
335 case SID_LINE_ARROWS:
336 case SID_LINE_ARROW_CIRCLE:
337 case SID_LINE_CIRCLE_ARROW:
338 case SID_LINE_ARROW_SQUARE:
339 case SID_LINE_SQUARE_ARROW:
340 mpView->SetGlueVisible();
341 // keine break !
342 case SID_DRAW_LINE :
343 case SID_DRAW_XLINE:
344 aObjKind = OBJ_LINE;
345 break;
346
347 case SID_DRAW_MEASURELINE:
348 {
349 aObjKind = OBJ_MEASURE;
350 }
351 break;
352
353 case SID_DRAW_RECT :
354 case SID_DRAW_RECT_NOFILL :
355 case SID_DRAW_RECT_ROUND :
356 case SID_DRAW_RECT_ROUND_NOFILL:
357 case SID_DRAW_SQUARE :
358 case SID_DRAW_SQUARE_NOFILL :
359 case SID_DRAW_SQUARE_ROUND :
360 case SID_DRAW_SQUARE_ROUND_NOFILL:
361 {
362 aObjKind = OBJ_RECT;
363 }
364 break;
365
366 case SID_DRAW_ELLIPSE :
367 case SID_DRAW_ELLIPSE_NOFILL:
368 case SID_DRAW_CIRCLE :
369 case SID_DRAW_CIRCLE_NOFILL :
370 {
371 aObjKind = OBJ_CIRC;
372 }
373 break;
374
375 case SID_DRAW_CAPTION:
376 case SID_DRAW_CAPTION_VERTICAL:
377 {
378 aObjKind = OBJ_CAPTION;
379 }
380 break;
381
382 case SID_TOOL_CONNECTOR:
383 case SID_CONNECTOR_ARROW_START:
384 case SID_CONNECTOR_ARROW_END:
385 case SID_CONNECTOR_ARROWS:
386 case SID_CONNECTOR_CIRCLE_START:
387 case SID_CONNECTOR_CIRCLE_END:
388 case SID_CONNECTOR_CIRCLES:
389 case SID_CONNECTOR_LINE:
390 case SID_CONNECTOR_LINE_ARROW_START:
391 case SID_CONNECTOR_LINE_ARROW_END:
392 case SID_CONNECTOR_LINE_ARROWS:
393 case SID_CONNECTOR_LINE_CIRCLE_START:
394 case SID_CONNECTOR_LINE_CIRCLE_END:
395 case SID_CONNECTOR_LINE_CIRCLES:
396 case SID_CONNECTOR_CURVE:
397 case SID_CONNECTOR_CURVE_ARROW_START:
398 case SID_CONNECTOR_CURVE_ARROW_END:
399 case SID_CONNECTOR_CURVE_ARROWS:
400 case SID_CONNECTOR_CURVE_CIRCLE_START:
401 case SID_CONNECTOR_CURVE_CIRCLE_END:
402 case SID_CONNECTOR_CURVE_CIRCLES:
403 case SID_CONNECTOR_LINES:
404 case SID_CONNECTOR_LINES_ARROW_START:
405 case SID_CONNECTOR_LINES_ARROW_END:
406 case SID_CONNECTOR_LINES_ARROWS:
407 case SID_CONNECTOR_LINES_CIRCLE_START:
408 case SID_CONNECTOR_LINES_CIRCLE_END:
409 case SID_CONNECTOR_LINES_CIRCLES:
410 {
411 aObjKind = OBJ_EDGE;
412 mpView->SetGlueVisible();
413 }
414 break;
415
416 default:
417 {
418 aObjKind = OBJ_RECT;
419 }
420 break;
421 }
422
423 mpView->SetCurrentObj((sal_uInt16)aObjKind);
424
425 FuConstruct::Activate();
426 }
427
428 /*************************************************************************
429 |*
430 |* Function deaktivieren
431 |*
432 \************************************************************************/
433
Deactivate()434 void FuConstructRectangle::Deactivate()
435 {
436 if( nSlotId == SID_TOOL_CONNECTOR ||
437 nSlotId == SID_CONNECTOR_ARROW_START ||
438 nSlotId == SID_CONNECTOR_ARROW_END ||
439 nSlotId == SID_CONNECTOR_ARROWS ||
440 nSlotId == SID_CONNECTOR_CIRCLE_START ||
441 nSlotId == SID_CONNECTOR_CIRCLE_END ||
442 nSlotId == SID_CONNECTOR_CIRCLES ||
443 nSlotId == SID_CONNECTOR_LINE ||
444 nSlotId == SID_CONNECTOR_LINE_ARROW_START ||
445 nSlotId == SID_CONNECTOR_LINE_ARROW_END ||
446 nSlotId == SID_CONNECTOR_LINE_ARROWS ||
447 nSlotId == SID_CONNECTOR_LINE_CIRCLE_START ||
448 nSlotId == SID_CONNECTOR_LINE_CIRCLE_END ||
449 nSlotId == SID_CONNECTOR_LINE_CIRCLES ||
450 nSlotId == SID_CONNECTOR_CURVE ||
451 nSlotId == SID_CONNECTOR_CURVE_ARROW_START ||
452 nSlotId == SID_CONNECTOR_CURVE_ARROW_END ||
453 nSlotId == SID_CONNECTOR_CURVE_ARROWS ||
454 nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START ||
455 nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END ||
456 nSlotId == SID_CONNECTOR_CURVE_CIRCLES ||
457 nSlotId == SID_CONNECTOR_LINES ||
458 nSlotId == SID_CONNECTOR_LINES_ARROW_START ||
459 nSlotId == SID_CONNECTOR_LINES_ARROW_END ||
460 nSlotId == SID_CONNECTOR_LINES_ARROWS ||
461 nSlotId == SID_CONNECTOR_LINES_CIRCLE_START ||
462 nSlotId == SID_CONNECTOR_LINES_CIRCLE_END ||
463 nSlotId == SID_CONNECTOR_LINES_CIRCLES ||
464 nSlotId == SID_LINE_ARROW_START ||
465 nSlotId == SID_LINE_ARROW_END ||
466 nSlotId == SID_LINE_ARROWS ||
467 nSlotId == SID_LINE_ARROW_CIRCLE ||
468 nSlotId == SID_LINE_CIRCLE_ARROW ||
469 nSlotId == SID_LINE_ARROW_SQUARE ||
470 nSlotId == SID_LINE_SQUARE_ARROW )
471 {
472 mpView->SetGlueVisible( sal_False );
473 }
474 FuConstruct::Deactivate();
475 }
476
477
478 /*************************************************************************
479 |*
480 |* Attribute fuer das zu erzeugende Objekt setzen
481 |*
482 \************************************************************************/
483
SetAttributes(SfxItemSet & rAttr,SdrObject * pObj)484 void FuConstructRectangle::SetAttributes(SfxItemSet& rAttr, SdrObject* pObj)
485 {
486 if (nSlotId == SID_DRAW_RECT_ROUND ||
487 nSlotId == SID_DRAW_RECT_ROUND_NOFILL ||
488 nSlotId == SID_DRAW_SQUARE_ROUND ||
489 nSlotId == SID_DRAW_SQUARE_ROUND_NOFILL)
490 {
491 /**********************************************************************
492 * Abgerundete Ecken
493 **********************************************************************/
494 rAttr.Put(SdrEckenradiusItem(500));
495 }
496 else if (nSlotId == SID_CONNECTOR_LINE ||
497 nSlotId == SID_CONNECTOR_LINE_ARROW_START ||
498 nSlotId == SID_CONNECTOR_LINE_ARROW_END ||
499 nSlotId == SID_CONNECTOR_LINE_ARROWS ||
500 nSlotId == SID_CONNECTOR_LINE_CIRCLE_START ||
501 nSlotId == SID_CONNECTOR_LINE_CIRCLE_END ||
502 nSlotId == SID_CONNECTOR_LINE_CIRCLES)
503 {
504 /**********************************************************************
505 * Direkt-Verbinder
506 **********************************************************************/
507 rAttr.Put(SdrEdgeKindItem(SDREDGE_ONELINE));
508 }
509 else if (nSlotId == SID_CONNECTOR_LINES ||
510 nSlotId == SID_CONNECTOR_LINES_ARROW_START ||
511 nSlotId == SID_CONNECTOR_LINES_ARROW_END ||
512 nSlotId == SID_CONNECTOR_LINES_ARROWS ||
513 nSlotId == SID_CONNECTOR_LINES_CIRCLE_START ||
514 nSlotId == SID_CONNECTOR_LINES_CIRCLE_END ||
515 nSlotId == SID_CONNECTOR_LINES_CIRCLES)
516 {
517 /**********************************************************************
518 * Linien-Verbinder
519 **********************************************************************/
520 rAttr.Put(SdrEdgeKindItem(SDREDGE_THREELINES));
521 }
522 else if (nSlotId == SID_CONNECTOR_CURVE ||
523 nSlotId == SID_CONNECTOR_CURVE_ARROW_START ||
524 nSlotId == SID_CONNECTOR_CURVE_ARROW_END ||
525 nSlotId == SID_CONNECTOR_CURVE_ARROWS ||
526 nSlotId == SID_CONNECTOR_CURVE_CIRCLE_START ||
527 nSlotId == SID_CONNECTOR_CURVE_CIRCLE_END ||
528 nSlotId == SID_CONNECTOR_CURVE_CIRCLES)
529 {
530 /**********************************************************************
531 * Kurven-Verbinder
532 **********************************************************************/
533 rAttr.Put(SdrEdgeKindItem(SDREDGE_BEZIER));
534 }
535 else if ( nSlotId == SID_DRAW_CAPTION || nSlotId == SID_DRAW_CAPTION_VERTICAL )
536 {
537 /**********************************************************************
538 * Legendenobjekt
539 **********************************************************************/
540 Size aSize(pObj->GetLogicRect().GetSize());
541 rAttr.Put( SdrTextMinFrameHeightItem( aSize.Height() ) );
542 rAttr.Put( SdrTextMinFrameWidthItem( aSize.Width() ) );
543 rAttr.Put( SdrTextAutoGrowHeightItem( sal_True ) );
544 rAttr.Put( SdrTextAutoGrowWidthItem( sal_True ) );
545
546 // #103516# Support full with for vertical caption objects, too
547 if(SID_DRAW_CAPTION == nSlotId)
548 rAttr.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) );
549 else
550 rAttr.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_BLOCK ) );
551
552 rAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
553 rAttr.Put( SdrTextLeftDistItem( 100 ) );
554 rAttr.Put( SdrTextRightDistItem( 100 ) );
555 rAttr.Put( SdrTextUpperDistItem( 100 ) );
556 rAttr.Put( SdrTextLowerDistItem( 100 ) );
557 }
558 else if (nSlotId == SID_DRAW_MEASURELINE)
559 {
560 /**********************************************************************
561 * Masslinie
562 **********************************************************************/
563 SdPage* pPage = (SdPage*) mpView->GetSdrPageView()->GetPage();
564 String aName(SdResId(STR_POOLSHEET_MEASURE));
565 SfxStyleSheet* pSheet = (SfxStyleSheet*) pPage->GetModel()->
566 GetStyleSheetPool()->
567 Find(aName, SD_STYLE_FAMILY_GRAPHICS);
568 DBG_ASSERT(pSheet, "Objektvorlage nicht gefunden");
569
570 if (pSheet)
571 {
572 pObj->SetStyleSheet(pSheet, sal_False);
573 }
574
575 SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin();
576 String aStr(SdResId(STR_LAYER_MEASURELINES));
577 pObj->SetLayer(rAdmin.GetLayerID(aStr, sal_False));
578 }
579 else if (nSlotId == OBJ_CUSTOMSHAPE )
580 {
581 }
582 }
583
584
585 /*************************************************************************
586 |*
587 |* Linienanfaenge und -enden fuer das zu erzeugende Objekt setzen
588 |*
589 \************************************************************************/
590
getPolygon(sal_uInt16 nResId,SdrModel * pDoc)591 ::basegfx::B2DPolyPolygon getPolygon( sal_uInt16 nResId, SdrModel* pDoc )
592 {
593 ::basegfx::B2DPolyPolygon aRetval;
594 XLineEndListSharedPtr aLineEndList = pDoc->GetLineEndListFromSdrModel();
595
596 if( aLineEndList.get() )
597 {
598 String aArrowName( SVX_RES(nResId) );
599 long nCount = aLineEndList->Count();
600 long nIndex;
601 for( nIndex = 0L; nIndex < nCount; nIndex++ )
602 {
603 XLineEndEntry* pEntry = aLineEndList->GetLineEnd(nIndex);
604 if( pEntry->GetName() == aArrowName )
605 {
606 aRetval = pEntry->GetLineEnd();
607 break;
608 }
609 }
610 }
611
612 return aRetval;
613 }
614
SetLineEnds(SfxItemSet & rAttr,SdrObject * pObj)615 void FuConstructRectangle::SetLineEnds(SfxItemSet& rAttr, SdrObject* pObj)
616 {
617 if ( (pObj->GetObjIdentifier() == OBJ_EDGE &&
618 nSlotId != SID_TOOL_CONNECTOR &&
619 nSlotId != SID_CONNECTOR_LINE &&
620 nSlotId != SID_CONNECTOR_LINES &&
621 nSlotId != SID_CONNECTOR_CURVE) ||
622 nSlotId == SID_LINE_ARROW_START ||
623 nSlotId == SID_LINE_ARROW_END ||
624 nSlotId == SID_LINE_ARROWS ||
625 nSlotId == SID_LINE_ARROW_CIRCLE ||
626 nSlotId == SID_LINE_CIRCLE_ARROW ||
627 nSlotId == SID_LINE_ARROW_SQUARE ||
628 nSlotId == SID_LINE_SQUARE_ARROW )
629 {
630 /**************************************************************
631 * Linienanfaenge und -enden attributieren
632 **************************************************************/
633
634 // Pfeilspitze
635 ::basegfx::B2DPolyPolygon aArrow( getPolygon( RID_SVXSTR_ARROW, mpDoc ) );
636 if( !aArrow.count() )
637 {
638 ::basegfx::B2DPolygon aNewArrow;
639 aNewArrow.append(::basegfx::B2DPoint(10.0, 0.0));
640 aNewArrow.append(::basegfx::B2DPoint(0.0, 30.0));
641 aNewArrow.append(::basegfx::B2DPoint(20.0, 30.0));
642 aNewArrow.setClosed(true);
643 aArrow.append(aNewArrow);
644 }
645
646 // Kreis
647 ::basegfx::B2DPolyPolygon aCircle( getPolygon( RID_SVXSTR_CIRCLE, mpDoc ) );
648 if( !aCircle.count() )
649 {
650 ::basegfx::B2DPolygon aNewCircle;
651 aNewCircle = ::basegfx::tools::createPolygonFromEllipse(::basegfx::B2DPoint(0.0, 0.0), 250.0, 250.0);
652 aNewCircle.setClosed(true);
653 aCircle.append(aNewCircle);
654 }
655
656 // Quadrat
657 ::basegfx::B2DPolyPolygon aSquare( getPolygon( RID_SVXSTR_SQUARE, mpDoc ) );
658 if( !aSquare.count() )
659 {
660 ::basegfx::B2DPolygon aNewSquare;
661 aNewSquare.append(::basegfx::B2DPoint(0.0, 0.0));
662 aNewSquare.append(::basegfx::B2DPoint(10.0, 0.0));
663 aNewSquare.append(::basegfx::B2DPoint(10.0, 10.0));
664 aNewSquare.append(::basegfx::B2DPoint(0.0, 10.0));
665 aNewSquare.setClosed(true);
666 aSquare.append(aNewSquare);
667 }
668
669 SfxItemSet aSet( mpDoc->GetPool() );
670 mpView->GetAttributes( aSet );
671
672 // #i3908# Here, the default Line Start/End width for arrow construction is
673 // set. To have the same value in all situations (construction) in i3908
674 // it was decided to change the default to 0.03 cm for all situations.
675 long nWidth = 300; // (1/100th mm)
676
677 // Linienstaerke ermitteln und daraus die Linienendenstaerke berechnen
678 if( aSet.GetItemState( XATTR_LINEWIDTH ) != SFX_ITEM_DONTCARE )
679 {
680 long nValue = ( ( const XLineWidthItem& ) aSet.Get( XATTR_LINEWIDTH ) ).GetValue();
681 if( nValue > 0 )
682 nWidth = nValue * 3;
683 }
684
685 switch (nSlotId)
686 {
687 case SID_CONNECTOR_ARROWS:
688 case SID_CONNECTOR_LINE_ARROWS:
689 case SID_CONNECTOR_LINES_ARROWS:
690 case SID_CONNECTOR_CURVE_ARROWS:
691 case SID_LINE_ARROWS:
692 {
693 // Verbinder mit Pfeil-Enden
694 rAttr.Put(XLineStartItem(SVX_RESSTR(RID_SVXSTR_ARROW), aArrow));
695 rAttr.Put(XLineStartWidthItem(nWidth));
696 rAttr.Put(XLineEndItem(SVX_RESSTR(RID_SVXSTR_ARROW), aArrow));
697 rAttr.Put(XLineEndWidthItem(nWidth));
698 }
699 break;
700
701 case SID_CONNECTOR_ARROW_START:
702 case SID_CONNECTOR_LINE_ARROW_START:
703 case SID_CONNECTOR_LINES_ARROW_START:
704 case SID_CONNECTOR_CURVE_ARROW_START:
705 case SID_LINE_ARROW_START:
706 case SID_LINE_ARROW_CIRCLE:
707 case SID_LINE_ARROW_SQUARE:
708 {
709 // Verbinder mit Pfeil-Anfang
710 rAttr.Put(XLineStartItem(SVX_RESSTR(RID_SVXSTR_ARROW), aArrow));
711 rAttr.Put(XLineStartWidthItem(nWidth));
712 }
713 break;
714
715 case SID_CONNECTOR_ARROW_END:
716 case SID_CONNECTOR_LINE_ARROW_END:
717 case SID_CONNECTOR_LINES_ARROW_END:
718 case SID_CONNECTOR_CURVE_ARROW_END:
719 case SID_LINE_ARROW_END:
720 case SID_LINE_CIRCLE_ARROW:
721 case SID_LINE_SQUARE_ARROW:
722 {
723 // Verbinder mit Pfeil-Ende
724 rAttr.Put(XLineEndItem(SVX_RESSTR(RID_SVXSTR_ARROW), aArrow));
725 rAttr.Put(XLineEndWidthItem(nWidth));
726 }
727 break;
728
729 case SID_CONNECTOR_CIRCLES:
730 case SID_CONNECTOR_LINE_CIRCLES:
731 case SID_CONNECTOR_LINES_CIRCLES:
732 case SID_CONNECTOR_CURVE_CIRCLES:
733 {
734 // Verbinder mit Kreis-Enden
735 rAttr.Put(XLineStartItem(SVX_RESSTR(RID_SVXSTR_CIRCLE), aCircle));
736 rAttr.Put(XLineStartWidthItem(nWidth));
737 rAttr.Put(XLineEndItem(SVX_RESSTR(RID_SVXSTR_CIRCLE), aCircle));
738 rAttr.Put(XLineEndWidthItem(nWidth));
739 }
740 break;
741
742 case SID_CONNECTOR_CIRCLE_START:
743 case SID_CONNECTOR_LINE_CIRCLE_START:
744 case SID_CONNECTOR_LINES_CIRCLE_START:
745 case SID_CONNECTOR_CURVE_CIRCLE_START:
746 {
747 // Verbinder mit Kreis-Anfang
748 rAttr.Put(XLineStartItem(SVX_RESSTR(RID_SVXSTR_CIRCLE), aCircle));
749 rAttr.Put(XLineStartWidthItem(nWidth));
750 }
751 break;
752
753 case SID_CONNECTOR_CIRCLE_END:
754 case SID_CONNECTOR_LINE_CIRCLE_END:
755 case SID_CONNECTOR_LINES_CIRCLE_END:
756 case SID_CONNECTOR_CURVE_CIRCLE_END:
757 {
758 // Verbinder mit Kreis-Ende
759 rAttr.Put(XLineEndItem(SVX_RESSTR(RID_SVXSTR_CIRCLE), aCircle));
760 rAttr.Put(XLineEndWidthItem(nWidth));
761 }
762 break;
763 };
764
765 // Und nochmal fuer die noch fehlenden Enden
766 switch (nSlotId)
767 {
768 case SID_LINE_ARROW_CIRCLE:
769 {
770 // Kreis-Ende
771 rAttr.Put(XLineEndItem(SVX_RESSTR(RID_SVXSTR_CIRCLE), aCircle));
772 rAttr.Put(XLineEndWidthItem(nWidth));
773 }
774 break;
775
776 case SID_LINE_CIRCLE_ARROW:
777 {
778 // Kreis-Anfang
779 rAttr.Put(XLineStartItem(SVX_RESSTR(RID_SVXSTR_CIRCLE), aCircle));
780 rAttr.Put(XLineStartWidthItem(nWidth));
781 }
782 break;
783
784 case SID_LINE_ARROW_SQUARE:
785 {
786 // Quadrat-Ende
787 rAttr.Put(XLineEndItem(SVX_RESSTR(RID_SVXSTR_SQUARE), aSquare));
788 rAttr.Put(XLineEndWidthItem(nWidth));
789 }
790 break;
791
792 case SID_LINE_SQUARE_ARROW:
793 {
794 // Quadrat-Anfang
795 rAttr.Put(XLineStartItem(SVX_RESSTR(RID_SVXSTR_SQUARE), aSquare));
796 rAttr.Put(XLineStartWidthItem(nWidth));
797 }
798 break;
799 }
800 }
801 }
802
803 // #97016#
CreateDefaultObject(const sal_uInt16 nID,const Rectangle & rRectangle)804 SdrObject* FuConstructRectangle::CreateDefaultObject(const sal_uInt16 nID, const Rectangle& rRectangle)
805 {
806 DBG_ASSERT( (nID != SID_DRAW_FONTWORK) && (nID != SID_DRAW_FONTWORK_VERTICAL ), "FuConstRectangle::CreateDefaultObject can not create Fontwork shapes!" );
807
808 // case SID_DRAW_LINE:
809 // case SID_DRAW_XLINE:
810 // case SID_DRAW_MEASURELINE:
811 // case SID_LINE_ARROW_START:
812 // case SID_LINE_ARROW_END:
813 // case SID_LINE_ARROWS:
814 // case SID_LINE_ARROW_CIRCLE:
815 // case SID_LINE_CIRCLE_ARROW:
816 // case SID_LINE_ARROW_SQUARE:
817 // case SID_LINE_SQUARE_ARROW:
818 // case SID_DRAW_RECT:
819 // case SID_DRAW_RECT_NOFILL:
820 // case SID_DRAW_RECT_ROUND:
821 // case SID_DRAW_RECT_ROUND_NOFILL:
822 // case SID_DRAW_SQUARE:
823 // case SID_DRAW_SQUARE_NOFILL:
824 // case SID_DRAW_SQUARE_ROUND:
825 // case SID_DRAW_SQUARE_ROUND_NOFILL:
826 // case SID_DRAW_ELLIPSE:
827 // case SID_DRAW_ELLIPSE_NOFILL:
828 // case SID_DRAW_CIRCLE:
829 // case SID_DRAW_CIRCLE_NOFILL:
830 // case SID_DRAW_CAPTION:
831 // case SID_DRAW_CAPTION_VERTICAL:
832 // case SID_TOOL_CONNECTOR:
833 // case SID_CONNECTOR_ARROW_START:
834 // case SID_CONNECTOR_ARROW_END:
835 // case SID_CONNECTOR_ARROWS:
836 // case SID_CONNECTOR_CIRCLE_START:
837 // case SID_CONNECTOR_CIRCLE_END:
838 // case SID_CONNECTOR_CIRCLES:
839 // case SID_CONNECTOR_LINE:
840 // case SID_CONNECTOR_LINE_ARROW_START:
841 // case SID_CONNECTOR_LINE_ARROW_END:
842 // case SID_CONNECTOR_LINE_ARROWS:
843 // case SID_CONNECTOR_LINE_CIRCLE_START:
844 // case SID_CONNECTOR_LINE_CIRCLE_END:
845 // case SID_CONNECTOR_LINE_CIRCLES:
846 // case SID_CONNECTOR_CURVE:
847 // case SID_CONNECTOR_CURVE_ARROW_START:
848 // case SID_CONNECTOR_CURVE_ARROW_END:
849 // case SID_CONNECTOR_CURVE_ARROWS:
850 // case SID_CONNECTOR_CURVE_CIRCLE_START:
851 // case SID_CONNECTOR_CURVE_CIRCLE_END:
852 // case SID_CONNECTOR_CURVE_CIRCLES:
853 // case SID_CONNECTOR_LINES:
854 // case SID_CONNECTOR_LINES_ARROW_START:
855 // case SID_CONNECTOR_LINES_ARROW_END:
856 // case SID_CONNECTOR_LINES_ARROWS:
857 // case SID_CONNECTOR_LINES_CIRCLE_START:
858 // case SID_CONNECTOR_LINES_CIRCLE_END:
859 // case SID_CONNECTOR_LINES_CIRCLES:
860
861 SdrObject* pObj = SdrObjFactory::MakeNewObject(
862 mpView->GetCurrentObjInventor(), mpView->GetCurrentObjIdentifier(),
863 0L, mpDoc);
864
865 if(pObj)
866 {
867 Rectangle aRect(rRectangle);
868
869 if(SID_DRAW_SQUARE == nID ||
870 SID_DRAW_SQUARE_NOFILL == nID ||
871 SID_DRAW_SQUARE_ROUND == nID ||
872 SID_DRAW_SQUARE_ROUND_NOFILL == nID ||
873 SID_DRAW_CIRCLE == nID ||
874 SID_DRAW_CIRCLE_NOFILL == nID)
875 {
876 // force quadratic
877 ImpForceQuadratic(aRect);
878 }
879
880 Point aStart = aRect.TopLeft();
881 Point aEnd = aRect.BottomRight();
882
883 switch(nID)
884 {
885 case SID_DRAW_LINE:
886 case SID_DRAW_XLINE:
887 case SID_LINE_ARROW_START:
888 case SID_LINE_ARROW_END:
889 case SID_LINE_ARROWS:
890 case SID_LINE_ARROW_CIRCLE:
891 case SID_LINE_CIRCLE_ARROW:
892 case SID_LINE_ARROW_SQUARE:
893 case SID_LINE_SQUARE_ARROW:
894 {
895 if(pObj->ISA(SdrPathObj))
896 {
897 sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2);
898
899 ::basegfx::B2DPolygon aB2DPolygon;
900 aB2DPolygon.append(::basegfx::B2DPoint(aStart.X(), nYMiddle));
901 aB2DPolygon.append(::basegfx::B2DPoint(aEnd.X(), nYMiddle));
902 ((SdrPathObj*)pObj)->SetPathPoly(::basegfx::B2DPolyPolygon(aB2DPolygon));
903 }
904 else
905 {
906 DBG_ERROR("Object is NO line object");
907 }
908
909 break;
910 }
911
912 case SID_DRAW_MEASURELINE:
913 {
914 if(pObj->ISA(SdrMeasureObj))
915 {
916 sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2);
917 ((SdrMeasureObj*)pObj)->SetPoint(Point(aStart.X(), nYMiddle), 0);
918 ((SdrMeasureObj*)pObj)->SetPoint(Point(aEnd.X(), nYMiddle), 1);
919 }
920 else
921 {
922 DBG_ERROR("Object is NO measure object");
923 }
924
925 break;
926 }
927
928 case SID_TOOL_CONNECTOR:
929 case SID_CONNECTOR_ARROW_START:
930 case SID_CONNECTOR_ARROW_END:
931 case SID_CONNECTOR_ARROWS:
932 case SID_CONNECTOR_CIRCLE_START:
933 case SID_CONNECTOR_CIRCLE_END:
934 case SID_CONNECTOR_CIRCLES:
935 case SID_CONNECTOR_LINE:
936 case SID_CONNECTOR_LINE_ARROW_START:
937 case SID_CONNECTOR_LINE_ARROW_END:
938 case SID_CONNECTOR_LINE_ARROWS:
939 case SID_CONNECTOR_LINE_CIRCLE_START:
940 case SID_CONNECTOR_LINE_CIRCLE_END:
941 case SID_CONNECTOR_LINE_CIRCLES:
942 case SID_CONNECTOR_CURVE:
943 case SID_CONNECTOR_CURVE_ARROW_START:
944 case SID_CONNECTOR_CURVE_ARROW_END:
945 case SID_CONNECTOR_CURVE_ARROWS:
946 case SID_CONNECTOR_CURVE_CIRCLE_START:
947 case SID_CONNECTOR_CURVE_CIRCLE_END:
948 case SID_CONNECTOR_CURVE_CIRCLES:
949 case SID_CONNECTOR_LINES:
950 case SID_CONNECTOR_LINES_ARROW_START:
951 case SID_CONNECTOR_LINES_ARROW_END:
952 case SID_CONNECTOR_LINES_ARROWS:
953 case SID_CONNECTOR_LINES_CIRCLE_START:
954 case SID_CONNECTOR_LINES_CIRCLE_END:
955 case SID_CONNECTOR_LINES_CIRCLES:
956 {
957 if(pObj->ISA(SdrEdgeObj))
958 {
959 ((SdrEdgeObj*)pObj)->SetTailPoint(sal_False, aStart);
960 ((SdrEdgeObj*)pObj)->SetTailPoint(sal_True, aEnd);
961 }
962 else
963 {
964 DBG_ERROR("Object is NO connector object");
965 }
966
967 break;
968 }
969 case SID_DRAW_CAPTION:
970 case SID_DRAW_CAPTION_VERTICAL:
971 {
972 if(pObj->ISA(SdrCaptionObj))
973 {
974 sal_Bool bIsVertical(SID_DRAW_CAPTION_VERTICAL == nID);
975
976 ((SdrTextObj*)pObj)->SetVerticalWriting(bIsVertical);
977
978 if(bIsVertical)
979 {
980 SfxItemSet aSet(pObj->GetMergedItemSet());
981 aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER));
982 aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
983 pObj->SetMergedItemSet(aSet);
984 }
985
986 // For task #105815# the default text is not inserted anymore.
987 // String aText(SdResId(STR_POOLSHEET_TEXT));
988 // ((SdrCaptionObj*)pObj)->SetText(aText);
989
990 ((SdrCaptionObj*)pObj)->SetLogicRect(aRect);
991 ((SdrCaptionObj*)pObj)->SetTailPos(
992 aRect.TopLeft() - Point(aRect.GetWidth() / 2, aRect.GetHeight() / 2));
993 }
994 else
995 {
996 DBG_ERROR("Object is NO caption object");
997 }
998
999 break;
1000 }
1001
1002 default:
1003 {
1004 pObj->SetLogicRect(aRect);
1005
1006 break;
1007 }
1008 }
1009
1010 SfxItemSet aAttr(mpDoc->GetPool());
1011 SetStyleSheet(aAttr, pObj);
1012 SetAttributes(aAttr, pObj);
1013 SetLineEnds(aAttr, pObj);
1014 pObj->SetMergedItemSet(aAttr);
1015 }
1016
1017 return pObj;
1018 }
1019
1020 } // end of namespace sd
1021