1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
21 #include <com/sun/star/lang/DisposedException.hpp>
22 #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
23 #include <com/sun/star/awt/FontSlant.hpp>
24 #include <com/sun/star/style/VerticalAlignment.hpp>
25 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
26 #include <com/sun/star/drawing/XEnhancedCustomShapeDefaulter.hpp>
27 #include <com/sun/star/awt/TextAlign.hpp>
28 #include <com/sun/star/style/ParagraphAdjust.hpp>
29 #include <com/sun/star/drawing/PointSequenceSequence.hpp>
30 #include <com/sun/star/drawing/PointSequence.hpp>
31 #include <com/sun/star/drawing/PolygonKind.hpp>
32 #include <com/sun/star/graphic/XGraphic.hpp>
33 #include <com/sun/star/drawing/QRCode.hpp>
34 #include <o3tl/any.hxx>
35 #include <o3tl/safeint.hxx>
36 #include <vcl/svapp.hxx>
37 #include <vcl/wmf.hxx>
38 #include <vcl/cvtgrf.hxx>
39 #include <vcl/GraphicLoader.hxx>
41 #include <svx/svdpool.hxx>
43 #include <editeng/unoprnms.hxx>
44 #include <svx/unoshape.hxx>
45 #include <svx/unopage.hxx>
46 #include <svx/svdobj.hxx>
47 #include <svx/svdpage.hxx>
48 #include <svx/svdmodel.hxx>
49 #include <svx/svdouno.hxx>
50 #include "shapeimpl.hxx"
51 #include <svx/unoshprp.hxx>
52 #include <svx/svdoashp.hxx>
53 #include <svx/svdviter.hxx>
54 #include <svx/svdview.hxx>
55 #include <svx/svdopath.hxx>
56 #include <basegfx/matrix/b2dhommatrix.hxx>
57 #include <basegfx/polygon/b2dpolygon.hxx>
58 #include <basegfx/point/b2dpoint.hxx>
59 #include <basegfx/polygon/b2dpolygontools.hxx>
60 #include <basegfx/polygon/b2dpolypolygontools.hxx>
61 #include <com/sun/star/awt/XBitmap.hpp>
62 #include <svx/svdograf.hxx>
63 #include <sal/log.hxx>
64 #include <cppuhelper/queryinterface.hxx>
65 #include <tools/stream.hxx>
70 using namespace ::osl
;
71 using namespace ::cppu
;
72 using namespace ::com::sun::star
;
73 using namespace ::com::sun::star::uno
;
74 using namespace ::com::sun::star::lang
;
75 using namespace ::com::sun::star::container
;
77 #define QUERYINT( xint ) \
78 if( rType == cppu::UnoType<xint>::get() ) \
79 aAny <<= Reference< xint >(this)
81 SvxShapeGroup::SvxShapeGroup(SdrObject
* pObj
, SvxDrawPage
* pDrawPage
)
82 : SvxShape(pObj
, getSvxMapProvider().GetMap(SVXMAP_GROUP
), getSvxMapProvider().GetPropertySet(SVXMAP_GROUP
, SdrObject::GetGlobalDrawObjectItemPool()))
87 SvxShapeGroup::~SvxShapeGroup() noexcept
91 void SvxShapeGroup::Create( SdrObject
* pNewObj
, SvxDrawPage
* pNewPage
)
93 SvxShape::Create( pNewObj
, pNewPage
);
98 uno::Any SAL_CALL
SvxShapeGroup::queryInterface( const uno::Type
& rType
)
100 return SvxShape::queryInterface( rType
);
103 uno::Any SAL_CALL
SvxShapeGroup::queryAggregation( const uno::Type
& rType
)
107 QUERYINT( drawing::XShapeGroup
);
108 else QUERYINT( drawing::XShapes
);
109 else QUERYINT( drawing::XShapes2
);
110 else QUERYINT( container::XIndexAccess
);
111 else QUERYINT( container::XElementAccess
);
113 return SvxShape::queryAggregation( rType
);
118 uno::Sequence
< sal_Int8
> SAL_CALL
SvxShapeGroup::getImplementationId()
120 return css::uno::Sequence
<sal_Int8
>();
123 // css::drawing::XShape
126 OUString SAL_CALL
SvxShapeGroup::getShapeType()
128 return SvxShape::getShapeType();
131 awt::Point SAL_CALL
SvxShapeGroup::getPosition()
133 return SvxShape::getPosition();
137 void SAL_CALL
SvxShapeGroup::setPosition( const awt::Point
& Position
)
139 SvxShape::setPosition(Position
);
143 awt::Size SAL_CALL
SvxShapeGroup::getSize()
145 return SvxShape::getSize();
149 void SAL_CALL
SvxShapeGroup::setSize( const awt::Size
& rSize
)
151 SvxShape::setSize( rSize
);
154 // drawing::XShapeGroup
157 void SAL_CALL
SvxShapeGroup::enterGroup( )
160 // pDrView->EnterMarkedGroup();
164 void SAL_CALL
SvxShapeGroup::leaveGroup( )
167 // pDrView->LeaveOneGroup();
170 void SvxShapeGroup::addUnoShape( const uno::Reference
< drawing::XShape
>& xShape
, size_t nPos
)
172 if (!HasSdrObject() || !mxPage
.is())
174 OSL_FAIL("could not add XShape to group shape!");
178 SvxShape
* pShape
= comphelper::getUnoTunnelImplementation
<SvxShape
>( xShape
);
181 OSL_FAIL("could not add XShape to group shape!");
185 SdrObject
* pSdrShape
= pShape
->GetSdrObject();
186 if( pSdrShape
== nullptr )
187 pSdrShape
= mxPage
->CreateSdrObject_( xShape
);
189 if( pSdrShape
->IsInserted() )
190 pSdrShape
->getParentSdrObjListFromSdrObject()->RemoveObject( pSdrShape
->GetOrdNum() );
192 GetSdrObject()->GetSubList()->InsertObject(pSdrShape
, nPos
);
193 // TTTT Was created using mpModel in CreateSdrObject_ above
194 // TTTT may be good to add an assertion here for the future
195 // pSdrShape->SetModel(GetSdrObject()->GetModel());
197 // #85922# It makes no sense to set the layer asked
198 // from the group object since this is an iteration
199 // over the contained objects. In consequence, this
200 // statement erases all layer information from the draw
201 // objects. Layers need to be set at draw objects directly
202 // and have nothing to do with grouping at all.
203 // pSdrShape->SetLayer(pObject->GetLayer());
205 // Establish connection between new SdrObject and its wrapper before
206 // inserting the new shape into the group. There a new wrapper
207 // would be created when this connection would not already exist.
208 pShape
->Create( pSdrShape
, mxPage
.get() );
210 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
214 void SAL_CALL
SvxShapeGroup::add( const uno::Reference
< drawing::XShape
>& xShape
)
216 ::SolarMutexGuard aGuard
;
218 // Add to the top of the stack (i.e. bottom of the list) by default.
219 addUnoShape(xShape
, SAL_MAX_SIZE
);
223 void SAL_CALL
SvxShapeGroup::remove( const uno::Reference
< drawing::XShape
>& xShape
)
225 ::SolarMutexGuard aGuard
;
227 SdrObject
* pSdrShape
= SdrObject::getSdrObjectFromXShape( xShape
);
229 if( !HasSdrObject() || pSdrShape
== nullptr || pSdrShape
->getParentSdrObjectFromSdrObject() != GetSdrObject() )
230 throw uno::RuntimeException();
232 SdrObjList
& rList
= *pSdrShape
->getParentSdrObjListFromSdrObject();
234 const size_t nObjCount
= rList
.GetObjCount();
236 while( nObjNum
< nObjCount
)
238 if(rList
.GetObj( nObjNum
) == pSdrShape
)
243 if( nObjNum
< nObjCount
)
246 // If the SdrObject which is about to be deleted is in any selection,
247 // deselect it first.
248 SdrViewIter
aIter( pSdrShape
);
250 for ( SdrView
* pView
= aIter
.FirstView(); pView
; pView
= aIter
.NextView() )
252 if(SAL_MAX_SIZE
!= pView
->TryToFindMarkedObject(pSdrShape
))
254 pView
->MarkObj(pSdrShape
, pView
->GetSdrPageView(), true);
258 SdrObject
* pObject
= rList
.NbcRemoveObject( nObjNum
);
259 SdrObject::Free( pObject
);
263 SAL_WARN( "svx", "Fatality! SdrObject is not belonging to its SdrObjList! [CL]" );
266 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
269 void SAL_CALL
SvxShapeGroup::addTop( const uno::Reference
< drawing::XShape
>& xShape
)
271 SolarMutexGuard aGuard
;
273 // Add to the top of the stack (i.e. bottom of the list).
274 addUnoShape(xShape
, SAL_MAX_SIZE
);
277 void SAL_CALL
SvxShapeGroup::addBottom( const uno::Reference
< drawing::XShape
>& xShape
)
279 SolarMutexGuard aGuard
;
281 // Add to the bottom of the stack (i.e. top of the list).
282 addUnoShape(xShape
, 0);
288 sal_Int32 SAL_CALL
SvxShapeGroup::getCount()
290 ::SolarMutexGuard aGuard
;
292 if(!HasSdrObject() || !GetSdrObject()->GetSubList())
293 throw uno::RuntimeException();
295 sal_Int32 nRetval
= GetSdrObject()->GetSubList()->GetObjCount();
300 uno::Any SAL_CALL
SvxShapeGroup::getByIndex( sal_Int32 Index
)
302 ::SolarMutexGuard aGuard
;
304 if( !HasSdrObject() || GetSdrObject()->GetSubList() == nullptr )
305 throw uno::RuntimeException();
307 if( Index
<0 || GetSdrObject()->GetSubList()->GetObjCount() <= o3tl::make_unsigned(Index
) )
308 throw lang::IndexOutOfBoundsException();
310 SdrObject
* pDestObj
= GetSdrObject()->GetSubList()->GetObj( Index
);
312 if(pDestObj
== nullptr)
313 throw lang::IndexOutOfBoundsException();
315 Reference
< drawing::XShape
> xShape( pDestObj
->getUnoShape(), uno::UNO_QUERY
);
316 return uno::makeAny( xShape
);
319 // css::container::XElementAccess
322 uno::Type SAL_CALL
SvxShapeGroup::getElementType()
324 return cppu::UnoType
<drawing::XShape
>::get();
328 sal_Bool SAL_CALL
SvxShapeGroup::hasElements()
330 ::SolarMutexGuard aGuard
;
332 return HasSdrObject() && GetSdrObject()->GetSubList() && (GetSdrObject()->GetSubList()->GetObjCount() > 0);
335 SvxShapeConnector::SvxShapeConnector(SdrObject
* pObj
)
336 : SvxShapeText( pObj
, getSvxMapProvider().GetMap(SVXMAP_CONNECTOR
), getSvxMapProvider().GetPropertySet(SVXMAP_CONNECTOR
, SdrObject::GetGlobalDrawObjectItemPool()) )
341 SvxShapeConnector::~SvxShapeConnector() noexcept
346 uno::Any SAL_CALL
SvxShapeConnector::queryInterface( const uno::Type
& rType
)
348 return SvxShapeText::queryInterface( rType
);
351 uno::Any SAL_CALL
SvxShapeConnector::queryAggregation( const uno::Type
& rType
)
355 QUERYINT( drawing::XConnectorShape
);
357 return SvxShapeText::queryAggregation( rType
);
364 uno::Sequence
< uno::Type
> SAL_CALL
SvxShapeConnector::getTypes()
366 return SvxShape::getTypes();
369 uno::Sequence
< sal_Int8
> SAL_CALL
SvxShapeConnector::getImplementationId()
371 return css::uno::Sequence
<sal_Int8
>();
374 // css::drawing::XShape
377 OUString SAL_CALL
SvxShapeConnector::getShapeType()
379 return SvxShapeText::getShapeType();
382 awt::Point SAL_CALL
SvxShapeConnector::getPosition()
384 return SvxShapeText::getPosition();
388 void SAL_CALL
SvxShapeConnector::setPosition( const awt::Point
& Position
)
390 SvxShapeText::setPosition(Position
);
394 awt::Size SAL_CALL
SvxShapeConnector::getSize()
396 return SvxShapeText::getSize();
400 void SAL_CALL
SvxShapeConnector::setSize( const awt::Size
& rSize
)
402 SvxShapeText::setSize( rSize
);
408 void SAL_CALL
SvxShapeConnector::connectStart( const uno::Reference
< drawing::XConnectableShape
>& xShape
, drawing::ConnectionType
)
410 ::SolarMutexGuard aGuard
;
412 Reference
< drawing::XShape
> xRef( xShape
, UNO_QUERY
);
413 SdrObject
* pSdrObject
= SdrObject::getSdrObjectFromXShape( xRef
);
416 GetSdrObject()->ConnectToNode( true, pSdrObject
);
418 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
422 void SAL_CALL
SvxShapeConnector::connectEnd( const uno::Reference
< drawing::XConnectableShape
>& xShape
, drawing::ConnectionType
)
424 ::SolarMutexGuard aGuard
;
426 Reference
< drawing::XShape
> xRef( xShape
, UNO_QUERY
);
427 SdrObject
* pSdrObject
= SdrObject::getSdrObjectFromXShape( xRef
);
429 if( HasSdrObject() && pSdrObject
)
430 GetSdrObject()->ConnectToNode( false, pSdrObject
);
432 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
436 void SAL_CALL
SvxShapeConnector::disconnectBegin( const uno::Reference
< drawing::XConnectableShape
>& )
438 ::SolarMutexGuard aGuard
;
441 GetSdrObject()->DisconnectFromNode( true );
443 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
447 void SAL_CALL
SvxShapeConnector::disconnectEnd( const uno::Reference
< drawing::XConnectableShape
>& )
449 ::SolarMutexGuard aGuard
;
452 GetSdrObject()->DisconnectFromNode( false );
454 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
457 SvxShapeControl::SvxShapeControl(SdrObject
* pObj
)
458 : SvxShapeText( pObj
, getSvxMapProvider().GetMap(SVXMAP_CONTROL
), getSvxMapProvider().GetPropertySet(SVXMAP_CONTROL
, SdrObject::GetGlobalDrawObjectItemPool()) )
460 setShapeKind( OBJ_UNO
);
464 SvxShapeControl::~SvxShapeControl() noexcept
469 uno::Any SAL_CALL
SvxShapeControl::queryInterface( const uno::Type
& rType
)
471 return SvxShapeText::queryInterface( rType
);
474 uno::Any SAL_CALL
SvxShapeControl::queryAggregation( const uno::Type
& rType
)
478 QUERYINT( drawing::XControlShape
);
480 return SvxShapeText::queryAggregation( rType
);
487 uno::Sequence
< uno::Type
> SAL_CALL
SvxShapeControl::getTypes()
489 return SvxShape::getTypes();
492 uno::Sequence
< sal_Int8
> SAL_CALL
SvxShapeControl::getImplementationId()
494 return css::uno::Sequence
<sal_Int8
>();
497 // css::drawing::XShape
500 OUString SAL_CALL
SvxShapeControl::getShapeType()
502 return SvxShapeText::getShapeType();
505 awt::Point SAL_CALL
SvxShapeControl::getPosition()
507 return SvxShapeText::getPosition();
511 void SAL_CALL
SvxShapeControl::setPosition( const awt::Point
& Position
)
513 SvxShapeText::setPosition(Position
);
517 awt::Size SAL_CALL
SvxShapeControl::getSize()
519 return SvxShapeText::getSize();
523 void SAL_CALL
SvxShapeControl::setSize( const awt::Size
& rSize
)
525 SvxShapeText::setSize( rSize
);
531 Reference
< awt::XControlModel
> SAL_CALL
SvxShapeControl::getControl()
533 ::SolarMutexGuard aGuard
;
535 Reference
< awt::XControlModel
> xModel
;
537 SdrUnoObj
* pUnoObj
= dynamic_cast< SdrUnoObj
* >(GetSdrObject());
539 xModel
= pUnoObj
->GetUnoControlModel();
545 void SAL_CALL
SvxShapeControl::setControl( const Reference
< awt::XControlModel
>& xControl
)
547 ::SolarMutexGuard aGuard
;
549 SdrUnoObj
* pUnoObj
= dynamic_cast< SdrUnoObj
* >(GetSdrObject());
551 pUnoObj
->SetUnoControlModel( xControl
);
553 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
558 const char* mpAPIName
;
559 sal_uInt16 mnAPINameLen
;
561 const char* mpFormName
;
562 sal_uInt16 mnFormNameLen
;
564 const SvxShapeControlPropertyMapping
[] =
566 // Warning: The first entry must be FontSlant because the any needs to be converted
567 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_POSTURE
), RTL_CONSTASCII_STRINGPARAM("FontSlant") }, // const sal_Int16 => css::awt::FontSlant
568 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_FONTNAME
), RTL_CONSTASCII_STRINGPARAM("FontName") },
569 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_FONTSTYLENAME
), RTL_CONSTASCII_STRINGPARAM("FontStyleName") },
570 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_FONTFAMILY
), RTL_CONSTASCII_STRINGPARAM("FontFamily") },
571 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_FONTCHARSET
), RTL_CONSTASCII_STRINGPARAM("FontCharset") },
572 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_HEIGHT
), RTL_CONSTASCII_STRINGPARAM("FontHeight") },
573 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_FONTPITCH
), RTL_CONSTASCII_STRINGPARAM("FontPitch" ) },
574 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_WEIGHT
), RTL_CONSTASCII_STRINGPARAM("FontWeight" ) },
575 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_UNDERLINE
), RTL_CONSTASCII_STRINGPARAM("FontUnderline") },
576 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_STRIKEOUT
), RTL_CONSTASCII_STRINGPARAM("FontStrikeout") },
577 { RTL_CONSTASCII_STRINGPARAM("CharKerning"), RTL_CONSTASCII_STRINGPARAM("FontKerning") },
578 { RTL_CONSTASCII_STRINGPARAM("CharWordMode"), RTL_CONSTASCII_STRINGPARAM("FontWordLineMode" ) },
579 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_CHAR_COLOR
), RTL_CONSTASCII_STRINGPARAM("TextColor") },
580 { RTL_CONSTASCII_STRINGPARAM("CharBackColor"), RTL_CONSTASCII_STRINGPARAM("CharBackColor") },
581 { RTL_CONSTASCII_STRINGPARAM("CharBackTransparent"), RTL_CONSTASCII_STRINGPARAM("CharBackTransparent") },
582 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_TEXT_CHAINNEXTNAME
), RTL_CONSTASCII_STRINGPARAM(UNO_NAME_TEXT_CHAINNEXTNAME
) },
583 { RTL_CONSTASCII_STRINGPARAM("CharRelief"), RTL_CONSTASCII_STRINGPARAM("FontRelief") },
584 { RTL_CONSTASCII_STRINGPARAM("CharUnderlineColor"), RTL_CONSTASCII_STRINGPARAM("TextLineColor") },
585 { RTL_CONSTASCII_STRINGPARAM(UNO_NAME_EDIT_PARA_ADJUST
), RTL_CONSTASCII_STRINGPARAM("Align") },
586 { RTL_CONSTASCII_STRINGPARAM("TextVerticalAdjust"), RTL_CONSTASCII_STRINGPARAM("VerticalAlign") },
587 { RTL_CONSTASCII_STRINGPARAM("ControlBackground"), RTL_CONSTASCII_STRINGPARAM("BackgroundColor") },
588 { RTL_CONSTASCII_STRINGPARAM("ControlSymbolColor"), RTL_CONSTASCII_STRINGPARAM("SymbolColor") },
589 { RTL_CONSTASCII_STRINGPARAM("ControlBorder"), RTL_CONSTASCII_STRINGPARAM("Border") },
590 { RTL_CONSTASCII_STRINGPARAM("ControlBorderColor"), RTL_CONSTASCII_STRINGPARAM("BorderColor") },
591 { RTL_CONSTASCII_STRINGPARAM("ControlTextEmphasis"), RTL_CONSTASCII_STRINGPARAM("FontEmphasisMark") },
592 { RTL_CONSTASCII_STRINGPARAM("ImageScaleMode"), RTL_CONSTASCII_STRINGPARAM("ScaleMode") },
593 { RTL_CONSTASCII_STRINGPARAM("ControlWritingMode"), RTL_CONSTASCII_STRINGPARAM("WritingMode") },
594 //added for exporting OCX control
595 { RTL_CONSTASCII_STRINGPARAM("ControlTypeinMSO"), RTL_CONSTASCII_STRINGPARAM("ControlTypeinMSO") },
596 { RTL_CONSTASCII_STRINGPARAM("ObjIDinMSO"), RTL_CONSTASCII_STRINGPARAM("ObjIDinMSO") },
597 { RTL_CONSTASCII_STRINGPARAM("CharCaseMap"), RTL_CONSTASCII_STRINGPARAM("CharCaseMap") },
598 { nullptr,0, nullptr, 0 }
603 bool lcl_convertPropertyName( const OUString
& rApiName
, OUString
& rInternalName
)
606 while( SvxShapeControlPropertyMapping
[i
].mpAPIName
)
608 if( rApiName
.reverseCompareToAsciiL( SvxShapeControlPropertyMapping
[i
].mpAPIName
, SvxShapeControlPropertyMapping
[i
].mnAPINameLen
) == 0 )
610 rInternalName
= OUString( SvxShapeControlPropertyMapping
[i
].mpFormName
, SvxShapeControlPropertyMapping
[i
].mnFormNameLen
, RTL_TEXTENCODING_ASCII_US
);
614 return !rInternalName
.isEmpty();
617 struct EnumConversionMap
619 style::ParagraphAdjust nAPIValue
;
620 sal_Int16 nFormValue
;
623 EnumConversionMap
const aMapAdjustToAlign
[] =
625 // note that order matters:
626 // lcl_convertTextAlignmentToParaAdjustment and lcl_convertParaAdjustmentToTextAlignment search this map from the _beginning_
627 // and use the first matching entry
628 {style::ParagraphAdjust_LEFT
, sal_Int16(awt::TextAlign::LEFT
)},
629 {style::ParagraphAdjust_CENTER
, sal_Int16(awt::TextAlign::CENTER
)},
630 {style::ParagraphAdjust_RIGHT
, sal_Int16(awt::TextAlign::RIGHT
)},
631 {style::ParagraphAdjust_BLOCK
, sal_Int16(awt::TextAlign::RIGHT
)},
632 {style::ParagraphAdjust_STRETCH
, sal_Int16(awt::TextAlign::LEFT
)},
633 {style::ParagraphAdjust(-1),-1}
636 void lcl_convertTextAlignmentToParaAdjustment( Any
& _rValue
)
638 sal_Int16 nValue
= sal_Int16();
639 OSL_VERIFY( _rValue
>>= nValue
);
641 for ( auto const & rEntry
: aMapAdjustToAlign
)
642 if ( nValue
== rEntry
.nFormValue
)
644 _rValue
<<= static_cast<sal_uInt16
>(rEntry
.nAPIValue
);
649 void lcl_convertParaAdjustmentToTextAlignment( Any
& _rValue
)
651 sal_Int32 nValue
= 0;
652 OSL_VERIFY( _rValue
>>= nValue
);
654 for ( auto const & rEntry
: aMapAdjustToAlign
)
655 if ( static_cast<style::ParagraphAdjust
>(nValue
) == rEntry
.nAPIValue
)
657 _rValue
<<= rEntry
.nFormValue
;
662 void convertVerticalAdjustToVerticalAlign( Any
& _rValue
)
664 if ( !_rValue
.hasValue() )
667 drawing::TextVerticalAdjust eAdjust
= drawing::TextVerticalAdjust_TOP
;
668 style::VerticalAlignment eAlign
= style::VerticalAlignment_TOP
;
669 if ( !( _rValue
>>= eAdjust
) )
670 throw lang::IllegalArgumentException();
673 case drawing::TextVerticalAdjust_TOP
: eAlign
= style::VerticalAlignment_TOP
; break;
674 case drawing::TextVerticalAdjust_BOTTOM
: eAlign
= style::VerticalAlignment_BOTTOM
; break;
675 default: eAlign
= style::VerticalAlignment_MIDDLE
; break;
680 void convertVerticalAlignToVerticalAdjust( Any
& _rValue
)
682 if ( !_rValue
.hasValue() )
684 style::VerticalAlignment eAlign
= style::VerticalAlignment_TOP
;
685 drawing::TextVerticalAdjust eAdjust
= drawing::TextVerticalAdjust_TOP
;
686 OSL_VERIFY( _rValue
>>= eAlign
);
689 case style::VerticalAlignment_TOP
: eAdjust
= drawing::TextVerticalAdjust_TOP
; break;
690 case style::VerticalAlignment_BOTTOM
: eAdjust
= drawing::TextVerticalAdjust_BOTTOM
; break;
691 default: eAdjust
= drawing::TextVerticalAdjust_CENTER
; break;
697 void SAL_CALL
SvxShapeControl::setPropertyValue( const OUString
& aPropertyName
, const uno::Any
& aValue
)
700 if ( lcl_convertPropertyName( aPropertyName
, aFormsName
) )
702 uno::Reference
< beans::XPropertySet
> xControl( getControl(), uno::UNO_QUERY
);
705 uno::Reference
< beans::XPropertySetInfo
> xInfo( xControl
->getPropertySetInfo() );
706 if( xInfo
.is() && xInfo
->hasPropertyByName( aFormsName
) )
708 uno::Any
aConvertedValue( aValue
);
709 if ( aFormsName
== "FontSlant" )
711 awt::FontSlant nSlant
;
712 if( !(aValue
>>= nSlant
) )
713 throw lang::IllegalArgumentException();
714 aConvertedValue
<<= static_cast<sal_Int16
>(nSlant
);
716 else if ( aFormsName
== "Align" )
718 lcl_convertParaAdjustmentToTextAlignment( aConvertedValue
);
720 else if ( aFormsName
== "VerticalAlign" )
722 convertVerticalAdjustToVerticalAlign( aConvertedValue
);
725 xControl
->setPropertyValue( aFormsName
, aConvertedValue
);
731 SvxShape::setPropertyValue( aPropertyName
, aValue
);
735 uno::Any SAL_CALL
SvxShapeControl::getPropertyValue( const OUString
& aPropertyName
)
738 if ( lcl_convertPropertyName( aPropertyName
, aFormsName
) )
740 uno::Reference
< beans::XPropertySet
> xControl( getControl(), uno::UNO_QUERY
);
745 uno::Reference
< beans::XPropertySetInfo
> xInfo( xControl
->getPropertySetInfo() );
746 if( xInfo
.is() && xInfo
->hasPropertyByName( aFormsName
) )
748 aValue
= xControl
->getPropertyValue( aFormsName
);
749 if ( aFormsName
== "FontSlant" )
751 awt::FontSlant eSlant
= awt::FontSlant_NONE
;
752 sal_Int16 nSlant
= sal_Int16();
753 if ( aValue
>>= nSlant
)
755 eSlant
= static_cast<awt::FontSlant
>(nSlant
);
759 OSL_VERIFY( aValue
>>= eSlant
);
763 else if ( aFormsName
== "Align" )
765 lcl_convertTextAlignmentToParaAdjustment( aValue
);
767 else if ( aFormsName
== "VerticalAlign" )
769 convertVerticalAlignToVerticalAdjust( aValue
);
778 return SvxShape::getPropertyValue( aPropertyName
);
784 beans::PropertyState SAL_CALL
SvxShapeControl::getPropertyState( const OUString
& PropertyName
)
787 if ( lcl_convertPropertyName( PropertyName
, aFormsName
) )
789 uno::Reference
< beans::XPropertyState
> xControl( getControl(), uno::UNO_QUERY
);
790 uno::Reference
< beans::XPropertySet
> xPropSet( getControl(), uno::UNO_QUERY
);
792 if( xControl
.is() && xPropSet
.is() )
794 uno::Reference
< beans::XPropertySetInfo
> xInfo( xPropSet
->getPropertySetInfo() );
795 if( xInfo
.is() && xInfo
->hasPropertyByName( aFormsName
) )
797 return xControl
->getPropertyState( aFormsName
);
801 return beans::PropertyState_DEFAULT_VALUE
;
805 return SvxShape::getPropertyState( PropertyName
);
809 void SAL_CALL
SvxShapeControl::setPropertyToDefault( const OUString
& PropertyName
)
812 if ( lcl_convertPropertyName( PropertyName
, aFormsName
) )
814 uno::Reference
< beans::XPropertyState
> xControl( getControl(), uno::UNO_QUERY
);
815 uno::Reference
< beans::XPropertySet
> xPropSet( getControl(), uno::UNO_QUERY
);
817 if( xControl
.is() && xPropSet
.is() )
819 uno::Reference
< beans::XPropertySetInfo
> xInfo( xPropSet
->getPropertySetInfo() );
820 if( xInfo
.is() && xInfo
->hasPropertyByName( aFormsName
) )
822 xControl
->setPropertyToDefault( aFormsName
);
828 SvxShape::setPropertyToDefault( PropertyName
);
832 uno::Any SAL_CALL
SvxShapeControl::getPropertyDefault( const OUString
& aPropertyName
)
835 if ( lcl_convertPropertyName( aPropertyName
, aFormsName
) )
837 uno::Reference
< beans::XPropertyState
> xControl( getControl(), uno::UNO_QUERY
);
841 Any
aDefault( xControl
->getPropertyDefault( aFormsName
) );
842 if ( aFormsName
== "FontSlant" )
844 sal_Int16
nSlant( 0 );
846 aDefault
<<= static_cast<awt::FontSlant
>(nSlant
);
848 else if ( aFormsName
== "Align" )
850 lcl_convertTextAlignmentToParaAdjustment( aDefault
);
852 else if ( aFormsName
== "VerticalAlign" )
854 convertVerticalAlignToVerticalAdjust( aDefault
);
859 throw beans::UnknownPropertyException( aPropertyName
, static_cast<cppu::OWeakObject
*>(this));
863 return SvxShape::getPropertyDefault( aPropertyName
);
867 SvxShapeDimensioning::SvxShapeDimensioning(SdrObject
* pObj
)
868 : SvxShapeText( pObj
, getSvxMapProvider().GetMap(SVXMAP_DIMENSIONING
), getSvxMapProvider().GetPropertySet(SVXMAP_DIMENSIONING
, SdrObject::GetGlobalDrawObjectItemPool()) )
872 SvxShapeDimensioning::~SvxShapeDimensioning() noexcept
876 SvxShapeCircle::SvxShapeCircle(SdrObject
* pObj
)
877 : SvxShapeText( pObj
, getSvxMapProvider().GetMap(SVXMAP_CIRCLE
), getSvxMapProvider().GetPropertySet(SVXMAP_CIRCLE
, SdrObject::GetGlobalDrawObjectItemPool()) )
881 SvxShapeCircle::~SvxShapeCircle() noexcept
885 //////////////////////////////////////////////////////////////////////////////
887 SvxShapePolyPolygon::SvxShapePolyPolygon(
891 getSvxMapProvider().GetMap(SVXMAP_POLYPOLYGON
),
892 getSvxMapProvider().GetPropertySet(SVXMAP_POLYPOLYGON
, SdrObject::GetGlobalDrawObjectItemPool()))
896 SvxShapePolyPolygon::~SvxShapePolyPolygon() noexcept
900 bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString
& rName
, const SfxItemPropertyMapEntry
* pProperty
, const css::uno::Any
& rValue
)
902 switch( pProperty
->nWID
)
904 case OWN_ATTR_VALUE_POLYPOLYGONBEZIER
:
906 if( auto s
= o3tl::tryAccess
<drawing::PolyPolygonBezierCoords
>(rValue
) )
908 basegfx::B2DPolyPolygon
aNewPolyPolygon(
909 basegfx::utils::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(*s
));
911 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
912 ForceMetricToItemPoolMetric(aNewPolyPolygon
);
914 SetPolygon(aNewPolyPolygon
);
919 case OWN_ATTR_VALUE_POLYPOLYGON
:
921 if( auto s
= o3tl::tryAccess
<drawing::PointSequenceSequence
>(rValue
) )
923 basegfx::B2DPolyPolygon
aNewPolyPolygon(
924 basegfx::utils::UnoPointSequenceSequenceToB2DPolyPolygon(*s
));
926 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
927 ForceMetricToItemPoolMetric(aNewPolyPolygon
);
929 SetPolygon(aNewPolyPolygon
);
934 case OWN_ATTR_BASE_GEOMETRY
:
936 drawing::PointSequenceSequence aPointSequenceSequence
;
937 drawing::PolyPolygonBezierCoords aPolyPolygonBezierCoords
;
939 if( rValue
>>= aPointSequenceSequence
)
943 basegfx::B2DPolyPolygon aNewPolyPolygon
;
944 basegfx::B2DHomMatrix aNewHomogenMatrix
;
946 GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix
, aNewPolyPolygon
);
947 aNewPolyPolygon
= basegfx::utils::UnoPointSequenceSequenceToB2DPolyPolygon(aPointSequenceSequence
);
949 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
950 // Need to adapt aNewPolyPolygon from 100thmm to app-specific
951 ForceMetricToItemPoolMetric(aNewPolyPolygon
);
953 GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix
, aNewPolyPolygon
);
957 else if( rValue
>>= aPolyPolygonBezierCoords
)
961 basegfx::B2DPolyPolygon aNewPolyPolygon
;
962 basegfx::B2DHomMatrix aNewHomogenMatrix
;
964 GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix
, aNewPolyPolygon
);
965 aNewPolyPolygon
= basegfx::utils::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(aPolyPolygonBezierCoords
);
967 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
968 ForceMetricToItemPoolMetric(aNewPolyPolygon
);
970 GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix
, aNewPolyPolygon
);
976 case OWN_ATTR_VALUE_POLYGON
:
978 if( auto pSequence
= o3tl::tryAccess
<drawing::PointSequence
>(rValue
) )
980 // prepare new polygon
981 basegfx::B2DPolygon aNewPolygon
;
983 // get pointer to arrays
984 const awt::Point
* pArray
= pSequence
->getConstArray();
985 const awt::Point
* pArrayEnd
= pArray
+ pSequence
->getLength();
987 for(;pArray
!= pArrayEnd
;++pArray
)
989 aNewPolygon
.append(basegfx::B2DPoint(pArray
->X
, pArray
->Y
));
992 // check for closed state flag
993 basegfx::utils::checkClosed(aNewPolygon
);
995 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
996 basegfx::B2DPolyPolygon
aNewPolyPolygon(aNewPolygon
);
997 ForceMetricToItemPoolMetric(aNewPolyPolygon
);
1000 SetPolygon(aNewPolyPolygon
);
1006 return SvxShapeText::setPropertyValueImpl( rName
, pProperty
, rValue
);
1009 throw lang::IllegalArgumentException();
1012 bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString
& rName
, const SfxItemPropertyMapEntry
* pProperty
,
1013 css::uno::Any
& rValue
)
1015 switch( pProperty
->nWID
)
1017 case OWN_ATTR_VALUE_POLYPOLYGONBEZIER
:
1019 // pack a tools::PolyPolygon in a struct tools::PolyPolygon
1020 basegfx::B2DPolyPolygon
aPolyPoly(GetPolygon());
1022 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
1023 ForceMetricTo100th_mm(aPolyPoly
);
1025 drawing::PolyPolygonBezierCoords aRetval
;
1026 basegfx::utils::B2DPolyPolygonToUnoPolyPolygonBezierCoords(aPolyPoly
, aRetval
);
1031 case OWN_ATTR_VALUE_POLYPOLYGON
:
1033 // pack a tools::PolyPolygon in a struct tools::PolyPolygon
1034 basegfx::B2DPolyPolygon
aPolyPoly(GetPolygon());
1036 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
1037 ForceMetricTo100th_mm(aPolyPoly
);
1039 drawing::PointSequenceSequence
aRetval( aPolyPoly
.count() );
1040 basegfx::utils::B2DPolyPolygonToUnoPointSequenceSequence(aPolyPoly
, aRetval
);
1045 case OWN_ATTR_BASE_GEOMETRY
:
1047 // pack a tools::PolyPolygon in struct PolyPolygon
1048 basegfx::B2DPolyPolygon aPolyPoly
;
1049 basegfx::B2DHomMatrix aNewHomogenMatrix
;
1053 GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix
, aPolyPoly
);
1055 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
1056 ForceMetricTo100th_mm(aPolyPoly
);
1059 if(aPolyPoly
.areControlPointsUsed())
1061 drawing::PolyPolygonBezierCoords aRetval
;
1062 basegfx::utils::B2DPolyPolygonToUnoPolyPolygonBezierCoords(aPolyPoly
, aRetval
);
1067 drawing::PointSequenceSequence
aRetval(aPolyPoly
.count());
1068 basegfx::utils::B2DPolyPolygonToUnoPointSequenceSequence(aPolyPoly
, aRetval
);
1073 case OWN_ATTR_VALUE_POLYGON
:
1075 // pack a tools::PolyPolygon in a struct tools::PolyPolygon
1076 basegfx::B2DPolyPolygon
aPolyPoly(GetPolygon());
1078 // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
1079 ForceMetricTo100th_mm(aPolyPoly
);
1081 const sal_Int32
nCount(0 == aPolyPoly
.count() ? 0 : aPolyPoly
.getB2DPolygon(0).count());
1082 drawing::PointSequence
aRetval( nCount
);
1086 // get single polygon
1087 const basegfx::B2DPolygon
& aPoly(aPolyPoly
.getB2DPolygon(0));
1089 // get pointer to arrays
1090 awt::Point
* pSequence
= aRetval
.getArray();
1092 for(sal_Int32 b
=0;b
<nCount
;b
++)
1094 const basegfx::B2DPoint
aPoint(aPoly
.getB2DPoint(b
));
1095 *pSequence
++ = awt::Point( basegfx::fround(aPoint
.getX()), basegfx::fround(aPoint
.getY()) );
1102 case OWN_ATTR_VALUE_POLYGONKIND
:
1104 rValue
<<= GetPolygonKind();
1108 return SvxShapeText::getPropertyValueImpl( rName
, pProperty
, rValue
);
1114 drawing::PolygonKind
SvxShapePolyPolygon::GetPolygonKind() const
1116 ::SolarMutexGuard aGuard
;
1117 drawing::PolygonKind
aRetval(drawing::PolygonKind_LINE
);
1121 switch(GetSdrObject()->GetObjIdentifier())
1123 case OBJ_POLY
: aRetval
= drawing::PolygonKind_POLY
; break;
1124 case OBJ_PLIN
: aRetval
= drawing::PolygonKind_PLIN
; break;
1126 case OBJ_PATHLINE
: aRetval
= drawing::PolygonKind_PATHLINE
; break;
1128 case OBJ_PATHFILL
: aRetval
= drawing::PolygonKind_PATHFILL
; break;
1129 case OBJ_FREELINE
: aRetval
= drawing::PolygonKind_FREELINE
; break;
1130 case OBJ_FREEFILL
: aRetval
= drawing::PolygonKind_FREEFILL
; break;
1138 void SvxShapePolyPolygon::SetPolygon(const basegfx::B2DPolyPolygon
& rNew
)
1140 ::SolarMutexGuard aGuard
;
1143 static_cast<SdrPathObj
*>(GetSdrObject())->SetPathPoly(rNew
);
1147 basegfx::B2DPolyPolygon
SvxShapePolyPolygon::GetPolygon() const noexcept
1149 ::SolarMutexGuard aGuard
;
1153 return static_cast<SdrPathObj
*>(GetSdrObject())->GetPathPoly();
1157 return basegfx::B2DPolyPolygon();
1161 //////////////////////////////////////////////////////////////////////////////
1163 SvxGraphicObject::SvxGraphicObject(SdrObject
* pObj
)
1164 : SvxShapeText( pObj
, getSvxMapProvider().GetMap(SVXMAP_GRAPHICOBJECT
), getSvxMapProvider().GetPropertySet(SVXMAP_GRAPHICOBJECT
, SdrObject::GetGlobalDrawObjectItemPool()) )
1168 SvxGraphicObject::~SvxGraphicObject() noexcept
1172 bool SvxGraphicObject::setPropertyValueImpl( const OUString
& rName
, const SfxItemPropertyMapEntry
* pProperty
, const css::uno::Any
& rValue
)
1175 switch( pProperty
->nWID
)
1177 case OWN_ATTR_VALUE_FILLBITMAP
:
1179 if( auto pSeq
= o3tl::tryAccess
<uno::Sequence
<sal_Int8
>>(rValue
) )
1181 SvMemoryStream aMemStm
;
1184 aMemStm
.SetBuffer( const_cast<css::uno::Sequence
<sal_Int8
> *>(pSeq
)->getArray(), pSeq
->getLength(), pSeq
->getLength() );
1186 if( GraphicConverter::Import( aMemStm
, aGraphic
) == ERRCODE_NONE
)
1188 static_cast<SdrGrafObj
*>(GetSdrObject())->SetGraphic(aGraphic
);
1192 else if (rValue
.getValueType() == cppu::UnoType
<graphic::XGraphic
>::get())
1194 auto xGraphic
= rValue
.get
<uno::Reference
<graphic::XGraphic
>>();
1197 static_cast<SdrGrafObj
*>(GetSdrObject())->SetGraphic(Graphic(xGraphic
));
1201 else if (rValue
.getValueType() == cppu::UnoType
<awt::XBitmap
>::get())
1203 auto xBitmap
= rValue
.get
<uno::Reference
<awt::XBitmap
>>();
1206 uno::Reference
<graphic::XGraphic
> xGraphic(xBitmap
, uno::UNO_QUERY
);
1207 Graphic
aGraphic(xGraphic
);
1208 static_cast<SdrGrafObj
*>(GetSdrObject())->SetGraphic(aGraphic
);
1215 case OWN_ATTR_GRAFSTREAMURL
:
1217 OUString aStreamURL
;
1219 if( rValue
>>= aStreamURL
)
1221 if( !aStreamURL
.startsWith( UNO_NAME_GRAPHOBJ_URLPKGPREFIX
) )
1224 if( HasSdrObject() )
1226 static_cast<SdrGrafObj
*>(GetSdrObject())->SetGrafStreamURL( aStreamURL
);
1233 case OWN_ATTR_GRAPHIC_URL
:
1236 uno::Reference
<awt::XBitmap
> xBitmap
;
1237 if (rValue
>>= aURL
)
1239 Graphic aGraphic
= vcl::graphic::loadFromURL(aURL
);
1240 if (!aGraphic
.IsNone())
1242 static_cast<SdrGrafObj
*>(GetSdrObject())->SetGraphic(aGraphic
);
1246 else if (rValue
>>= xBitmap
)
1248 uno::Reference
<graphic::XGraphic
> xGraphic(xBitmap
, uno::UNO_QUERY
);
1251 Graphic aGraphic
= xGraphic
;
1252 if (!aGraphic
.IsNone())
1254 static_cast<SdrGrafObj
*>(GetSdrObject())->SetGraphic(aGraphic
);
1262 case OWN_ATTR_VALUE_GRAPHIC
:
1264 Reference
< graphic::XGraphic
> xGraphic( rValue
, uno::UNO_QUERY
);
1267 static_cast< SdrGrafObj
*>( GetSdrObject() )->SetGraphic( xGraphic
);
1273 case OWN_ATTR_IS_SIGNATURELINE
:
1275 bool bIsSignatureLine
;
1276 if (rValue
>>= bIsSignatureLine
)
1278 static_cast<SdrGrafObj
*>(GetSdrObject())->setIsSignatureLine(bIsSignatureLine
);
1284 case OWN_ATTR_SIGNATURELINE_ID
:
1286 OUString aSignatureLineId
;
1287 if (rValue
>>= aSignatureLineId
)
1289 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineId(aSignatureLineId
);
1295 case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_NAME
:
1297 OUString aSuggestedSignerName
;
1298 if (rValue
>>= aSuggestedSignerName
)
1300 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineSuggestedSignerName(aSuggestedSignerName
);
1306 case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_TITLE
:
1308 OUString aSuggestedSignerTitle
;
1309 if (rValue
>>= aSuggestedSignerTitle
)
1311 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineSuggestedSignerTitle(aSuggestedSignerTitle
);
1317 case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_EMAIL
:
1319 OUString aSuggestedSignerEmail
;
1320 if (rValue
>>= aSuggestedSignerEmail
)
1322 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineSuggestedSignerEmail(aSuggestedSignerEmail
);
1328 case OWN_ATTR_SIGNATURELINE_SIGNING_INSTRUCTIONS
:
1330 OUString aSigningInstructions
;
1331 if (rValue
>>= aSigningInstructions
)
1333 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineSigningInstructions(aSigningInstructions
);
1339 case OWN_ATTR_SIGNATURELINE_SHOW_SIGN_DATE
:
1342 if (rValue
>>= bShowSignDate
)
1344 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineShowSignDate(bShowSignDate
);
1350 case OWN_ATTR_SIGNATURELINE_CAN_ADD_COMMENT
:
1352 bool bCanAddComment
;
1353 if (rValue
>>= bCanAddComment
)
1355 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineCanAddComment(bCanAddComment
);
1361 case OWN_ATTR_SIGNATURELINE_UNSIGNED_IMAGE
:
1363 Reference
<graphic::XGraphic
> xGraphic(rValue
, uno::UNO_QUERY
);
1366 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineUnsignedGraphic(xGraphic
);
1372 case OWN_ATTR_SIGNATURELINE_IS_SIGNED
:
1375 if (rValue
>>= bIsSigned
)
1377 static_cast<SdrGrafObj
*>(GetSdrObject())->setSignatureLineIsSigned(bIsSigned
);
1383 case OWN_ATTR_QRCODE
:
1385 css::drawing::QRCode aQrCode
;
1386 if (rValue
>>= aQrCode
)
1388 static_cast<SdrGrafObj
*>(GetSdrObject())->setQrCode(aQrCode
);
1395 return SvxShapeText::setPropertyValueImpl( rName
, pProperty
, rValue
);
1399 throw lang::IllegalArgumentException();
1401 GetSdrObject()->getSdrModelFromSdrObject().SetChanged();
1406 bool SvxGraphicObject::getPropertyValueImpl( const OUString
& rName
, const SfxItemPropertyMapEntry
* pProperty
, css::uno::Any
& rValue
)
1408 switch( pProperty
->nWID
)
1410 case OWN_ATTR_VALUE_FILLBITMAP
:
1412 const Graphic
& rGraphic
= static_cast<SdrGrafObj
*>(GetSdrObject())->GetGraphic();
1414 if (rGraphic
.GetType() != GraphicType::GdiMetafile
)
1416 uno::Reference
<awt::XBitmap
> xBitmap(rGraphic
.GetXGraphic(), uno::UNO_QUERY
);
1421 SvMemoryStream
aDestStrm( 65535, 65535 );
1423 ConvertGDIMetaFileToWMF( rGraphic
.GetGDIMetaFile(), aDestStrm
, nullptr, false );
1424 const uno::Sequence
<sal_Int8
> aSeq(
1425 static_cast< const sal_Int8
* >(aDestStrm
.GetData()),
1426 aDestStrm
.GetEndOfData());
1432 case OWN_ATTR_REPLACEMENT_GRAPHIC
:
1434 const GraphicObject
* pGrafObj
= static_cast< SdrGrafObj
* >(GetSdrObject())->GetReplacementGraphicObject();
1438 rValue
<<= pGrafObj
->GetGraphic().GetXGraphic();
1444 case OWN_ATTR_GRAFSTREAMURL
:
1446 const OUString
aStreamURL( static_cast<SdrGrafObj
*>( GetSdrObject() )->GetGrafStreamURL() );
1447 if( !aStreamURL
.isEmpty() )
1448 rValue
<<= aStreamURL
;
1452 case OWN_ATTR_GRAPHIC_URL
:
1453 case OWN_ATTR_VALUE_GRAPHIC
:
1455 if (pProperty
->nWID
== OWN_ATTR_GRAPHIC_URL
)
1457 SAL_WARN("svx", "Getting Graphic by URL is not supported, getting it by value");
1460 Reference
<graphic::XGraphic
> xGraphic
;
1461 auto pSdrGraphicObject
= static_cast<SdrGrafObj
*>(GetSdrObject());
1462 if (pSdrGraphicObject
->GetGraphicObject().GetType() != GraphicType::NONE
)
1463 xGraphic
= pSdrGraphicObject
->GetGraphic().GetXGraphic();
1464 rValue
<<= xGraphic
;
1468 case OWN_ATTR_GRAPHIC_STREAM
:
1470 rValue
<<= static_cast< SdrGrafObj
* >( GetSdrObject() )->getInputStream();
1474 case OWN_ATTR_IS_SIGNATURELINE
:
1476 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->isSignatureLine();
1480 case OWN_ATTR_SIGNATURELINE_ID
:
1482 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->getSignatureLineId();
1486 case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_NAME
:
1488 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->getSignatureLineSuggestedSignerName();
1492 case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_TITLE
:
1494 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->getSignatureLineSuggestedSignerTitle();
1498 case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_EMAIL
:
1500 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->getSignatureLineSuggestedSignerEmail();
1504 case OWN_ATTR_SIGNATURELINE_SIGNING_INSTRUCTIONS
:
1506 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->getSignatureLineSigningInstructions();
1510 case OWN_ATTR_SIGNATURELINE_SHOW_SIGN_DATE
:
1512 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->isSignatureLineShowSignDate();
1516 case OWN_ATTR_SIGNATURELINE_CAN_ADD_COMMENT
:
1518 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->isSignatureLineCanAddComment();
1522 case OWN_ATTR_SIGNATURELINE_UNSIGNED_IMAGE
:
1524 Reference
<graphic::XGraphic
> xGraphic(
1525 static_cast<SdrGrafObj
*>(GetSdrObject())->getSignatureLineUnsignedGraphic());
1526 rValue
<<= xGraphic
;
1530 case OWN_ATTR_SIGNATURELINE_IS_SIGNED
:
1532 rValue
<<= static_cast<SdrGrafObj
*>(GetSdrObject())->isSignatureLineSigned();
1536 case OWN_ATTR_QRCODE
:
1538 css::drawing::QRCode
* ptr
= static_cast<SdrGrafObj
*>(GetSdrObject())->getQrCode();
1547 return SvxShapeText::getPropertyValueImpl(rName
, pProperty
,rValue
);
1554 SvxShapeCaption::SvxShapeCaption(SdrObject
* pObj
)
1555 : SvxShapeText( pObj
, getSvxMapProvider().GetMap(SVXMAP_CAPTION
), getSvxMapProvider().GetPropertySet(SVXMAP_CAPTION
, SdrObject::GetGlobalDrawObjectItemPool()) )
1559 SvxShapeCaption::~SvxShapeCaption() noexcept
1563 SvxCustomShape::SvxCustomShape(SdrObject
* pObj
)
1564 : SvxShapeText( pObj
, getSvxMapProvider().GetMap( SVXMAP_CUSTOMSHAPE
), getSvxMapProvider().GetPropertySet(SVXMAP_CUSTOMSHAPE
, SdrObject::GetGlobalDrawObjectItemPool()) )
1568 SvxCustomShape::~SvxCustomShape() noexcept
1572 uno::Any SAL_CALL
SvxCustomShape::queryInterface( const uno::Type
& rType
)
1574 return SvxShapeText::queryInterface( rType
);
1577 uno::Any SAL_CALL
SvxCustomShape::queryAggregation( const uno::Type
& rType
)
1579 css::uno::Any aReturn
= SvxShapeText::queryAggregation( rType
);
1580 if ( !aReturn
.hasValue() )
1581 aReturn
= ::cppu::queryInterface(rType
, static_cast<drawing::XEnhancedCustomShapeDefaulter
*>(this) );
1585 uno::Sequence
< sal_Int8
> SAL_CALL
SvxCustomShape::getImplementationId()
1587 return css::uno::Sequence
<sal_Int8
>();
1590 // css::drawing::XShape
1593 awt::Point SAL_CALL
SvxCustomShape::getPosition()
1595 ::SolarMutexGuard aGuard
;
1596 if ( HasSdrObject() )
1598 SdrAShapeObjGeoData aCustomShapeGeoData
;
1599 static_cast<SdrObjCustomShape
*>(GetSdrObject())->SaveGeoData( aCustomShapeGeoData
);
1601 bool bMirroredX
= false;
1602 bool bMirroredY
= false;
1604 if ( HasSdrObject() )
1606 bMirroredX
= static_cast<SdrObjCustomShape
*>(GetSdrObject())->IsMirroredX();
1607 bMirroredY
= static_cast<SdrObjCustomShape
*>(GetSdrObject())->IsMirroredY();
1609 // get aRect, this is the unrotated snaprect
1610 tools::Rectangle
aRect(static_cast<SdrObjCustomShape
*>(GetSdrObject())->GetLogicRect());
1611 tools::Rectangle
aRectangle( aRect
);
1613 if ( bMirroredX
|| bMirroredY
)
1614 { // we have to retrieve the unmirrored rect
1616 GeoStat
aNewGeo( aCustomShapeGeoData
.aGeo
);
1619 tools::Polygon
aPol( Rect2Poly( aRect
, aNewGeo
) );
1620 tools::Rectangle
aBoundRect( aPol
.GetBoundRect() );
1622 Point
aRef1( ( aBoundRect
.Left() + aBoundRect
.Right() ) >> 1, aBoundRect
.Top() );
1623 Point
aRef2( aRef1
.X(), aRef1
.Y() + 1000 );
1625 sal_uInt16 nPointCount
=aPol
.GetSize();
1626 for (i
=0; i
<nPointCount
; i
++)
1628 MirrorPoint(aPol
[i
],aRef1
,aRef2
);
1630 // turn and move polygon
1631 tools::Polygon
aPol0(aPol
);
1637 Poly2Rect(aPol
,aRectangle
,aNewGeo
);
1641 tools::Polygon
aPol( Rect2Poly( aRectangle
, aNewGeo
) );
1642 tools::Rectangle
aBoundRect( aPol
.GetBoundRect() );
1644 Point
aRef1( aBoundRect
.Left(), ( aBoundRect
.Top() + aBoundRect
.Bottom() ) >> 1 );
1645 Point
aRef2( aRef1
.X() + 1000, aRef1
.Y() );
1647 sal_uInt16 nPointCount
=aPol
.GetSize();
1648 for (i
=0; i
<nPointCount
; i
++)
1650 MirrorPoint(aPol
[i
],aRef1
,aRef2
);
1652 // turn and move polygon
1653 tools::Polygon
aPol0(aPol
);
1659 Poly2Rect( aPol
, aRectangle
, aNewGeo
);
1662 Point
aPt( aRectangle
.TopLeft() );
1664 if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() )
1665 aPt
-= GetSdrObject()->GetAnchorPos();
1667 ForceMetricTo100th_mm(aPt
);
1668 return css::awt::Point( aPt
.X(), aPt
.Y() );
1671 return SvxShape::getPosition();
1675 void SAL_CALL
SvxCustomShape::setPropertyValue( const OUString
& aPropertyName
, const uno::Any
& aValue
)
1677 ::SolarMutexGuard aGuard
;
1679 SdrObject
* pObject
= GetSdrObject();
1681 // tdf#98163 Use a custom slot to have filter code flush the UNO
1682 // API implementations of SdrObjCustomShape. Used e.g. by
1683 // ~SdXMLCustomShapeContext, see there for more information
1684 if("FlushCustomShapeUnoApiObjects" == aPropertyName
)
1686 SdrObjCustomShape
* pTarget
= dynamic_cast< SdrObjCustomShape
* >(pObject
);
1689 // Luckily, the object causing problems in tdf#93994 is not the
1690 // UNO API object, but the XCustomShapeEngine involved. This
1691 // object is on-demand replaceable and can be reset here. This
1692 // will free the involved EditEngine and VirtualDevice.
1693 pTarget
->mxCustomShapeEngine
.set(nullptr);
1695 // since this case is only for the application cores
1696 // we should return from this function now
1700 bool bCustomShapeGeometry
= pObject
&& aPropertyName
== "CustomShapeGeometry";
1702 bool bMirroredX
= false;
1703 bool bMirroredY
= false;
1705 if ( bCustomShapeGeometry
)
1707 bMirroredX
= static_cast<SdrObjCustomShape
*>(pObject
)->IsMirroredX();
1708 bMirroredY
= static_cast<SdrObjCustomShape
*>(pObject
)->IsMirroredY();
1711 SvxShape::setPropertyValue( aPropertyName
, aValue
);
1713 if ( !bCustomShapeGeometry
)
1716 static_cast<SdrObjCustomShape
*>(pObject
)->MergeDefaultAttributes();
1717 tools::Rectangle
aRect( pObject
->GetSnapRect() );
1720 bool bNeedsMirrorX
= static_cast<SdrObjCustomShape
*>(pObject
)->IsMirroredX() != bMirroredX
;
1721 bool bNeedsMirrorY
= static_cast<SdrObjCustomShape
*>(pObject
)->IsMirroredY() != bMirroredY
;
1723 std::unique_ptr
< SdrGluePointList
> pListCopy
;
1724 if( bNeedsMirrorX
|| bNeedsMirrorY
)
1726 const SdrGluePointList
* pList
= pObject
->GetGluePointList();
1728 pListCopy
.reset( new SdrGluePointList(*pList
) );
1731 if ( bNeedsMirrorX
)
1733 Point
aTop( ( aRect
.Left() + aRect
.Right() ) >> 1, aRect
.Top() );
1734 Point
aBottom( aTop
.X(), aTop
.Y() + 1000 );
1735 pObject
->NbcMirror( aTop
, aBottom
);
1736 // NbcMirroring is flipping the current mirror state,
1737 // so we have to set the correct state again
1738 static_cast<SdrObjCustomShape
*>(pObject
)->SetMirroredX( !bMirroredX
);
1740 if ( bNeedsMirrorY
)
1742 Point
aLeft( aRect
.Left(), ( aRect
.Top() + aRect
.Bottom() ) >> 1 );
1743 Point
aRight( aLeft
.X() + 1000, aLeft
.Y() );
1744 pObject
->NbcMirror( aLeft
, aRight
);
1745 // NbcMirroring is flipping the current mirror state,
1746 // so we have to set the correct state again
1747 static_cast<SdrObjCustomShape
*>(pObject
)->SetMirroredY( !bMirroredY
);
1752 SdrGluePointList
* pNewList
= const_cast< SdrGluePointList
* >( pObject
->GetGluePointList() );
1754 *pNewList
= *pListCopy
;
1758 bool SvxCustomShape::getPropertyValueImpl( const OUString
& rName
, const SfxItemPropertyMapEntry
* pProperty
, css::uno::Any
& rValue
)
1760 switch( pProperty
->nWID
)
1762 case SDRATTR_ROTATEANGLE
:
1764 double fAngle
= static_cast<SdrObjCustomShape
*>(GetSdrObject())->GetObjectRotation();
1766 rValue
<<= static_cast<sal_Int32
>(fAngle
);
1770 return SvxShape::getPropertyValueImpl( rName
, pProperty
, rValue
);
1774 void SvxCustomShape::createCustomShapeDefaults( const OUString
& rValueType
)
1776 if (!HasSdrObject())
1778 OSL_FAIL("could not create Custom Shape Defaults!");
1782 static_cast<SdrObjCustomShape
*>(GetSdrObject())->MergeDefaultAttributes( &rValueType
);
1785 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */