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 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 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 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 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 248 sal_Bool FuConstructRectangle::MouseMove(const MouseEvent& rMEvt) 249 { 250 return FuConstruct::MouseMove(rMEvt); 251 } 252 253 /************************************************************************* 254 |* 255 |* MouseButtonUp-event 256 |* 257 \************************************************************************/ 258 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 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 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 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 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 591 ::basegfx::B2DPolyPolygon getPolygon( sal_uInt16 nResId, SdrModel* pDoc ) 592 { 593 ::basegfx::B2DPolyPolygon aRetval; 594 XLineEndList* pLineEndList = pDoc->GetLineEndList(); 595 596 if( pLineEndList ) 597 { 598 String aArrowName( SVX_RES(nResId) ); 599 long nCount = pLineEndList->Count(); 600 long nIndex; 601 for( nIndex = 0L; nIndex < nCount; nIndex++ ) 602 { 603 XLineEndEntry* pEntry = pLineEndList->GetLineEnd(nIndex); 604 if( pEntry->GetName() == aArrowName ) 605 { 606 aRetval = pEntry->GetLineEnd(); 607 break; 608 } 609 } 610 } 611 612 return aRetval; 613 } 614 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# 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