summaryrefslogtreecommitdiff
path: root/binfilter/bf_svx/source/unodraw/svx_unoshap2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_svx/source/unodraw/svx_unoshap2.cxx')
-rw-r--r--binfilter/bf_svx/source/unodraw/svx_unoshap2.cxx1785
1 files changed, 1785 insertions, 0 deletions
diff --git a/binfilter/bf_svx/source/unodraw/svx_unoshap2.cxx b/binfilter/bf_svx/source/unodraw/svx_unoshap2.cxx
new file mode 100644
index 000000000000..0de62108482f
--- /dev/null
+++ b/binfilter/bf_svx/source/unodraw/svx_unoshap2.cxx
@@ -0,0 +1,1785 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _SVX_USE_UNOGLOBALS_
+
+#include <com/sun/star/awt/TextAlign.hpp> //added by BerryJia for fixing Bug102407 2002-11-4
+#include <com/sun/star/style/ParagraphAdjust.hpp> //added by BerryJia for fixing Bug102407 2002-11-4
+#include <com/sun/star/drawing/PointSequenceSequence.hpp>
+#include <com/sun/star/drawing/PointSequence.hpp>
+#include <bf_goodies/matrix3d.hxx>
+#include <unotools/localfilehelper.hxx>
+#include <vcl/svapp.hxx>
+#include <bf_svtools/fltcall.hxx>
+#include "impgrf.hxx"
+
+#include <rtl/uuid.h>
+#include <rtl/memory.h>
+
+#include "unopage.hxx"
+#include "svdpage.hxx"
+#include "svdmodel.hxx"
+#include "svdouno.hxx"
+#include "shapeimpl.hxx"
+
+class GDIMetaFile;
+class SvStream;
+
+namespace binfilter {
+
+using namespace ::cppu;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+
+using rtl::OUString;
+
+#define INTERFACE_TYPE( xint ) \
+ ::getCppuType((const Reference< xint >*)0)
+
+#define QUERYINT( xint ) \
+ if( rType == ::getCppuType((const Reference< xint >*)0) ) \
+ aAny <<= Reference< xint >(this)
+
+sal_Bool ConvertGDIMetaFileToWMF( const GDIMetaFile & rMTF, SvStream & rTargetStream, FilterConfigItem* pConfigItem = NULL, sal_Bool bPlaceable=sal_True);
+
+/***********************************************************************
+* class SvxShapeGroup *
+***********************************************************************/
+
+SvxShapeGroup::SvxShapeGroup( SdrObject* pSdrObj, SvxDrawPage* pDrawPage ) throw() :
+ SvxShape( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_GROUP) ),
+ pPage( pDrawPage )
+{
+ if( pPage )
+ pPage->acquire();
+}
+
+//----------------------------------------------------------------------
+SvxShapeGroup::~SvxShapeGroup() throw()
+{
+ if( pPage )
+ pPage->release();
+}
+
+//----------------------------------------------------------------------
+void SvxShapeGroup::Create( SdrObject* pNewObj, SvxDrawPage* pNewPage ) throw()
+{
+ if( pPage )
+ {
+ pPage->release();
+ pPage = NULL;
+ }
+
+ SvxShape::Create( pNewObj, pNewPage );
+
+ pPage = pNewPage;
+ if( pPage )
+ pPage->acquire();
+
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL SvxShapeGroup::queryInterface( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ return SvxShape::queryInterface( rType );
+}
+
+uno::Any SAL_CALL SvxShapeGroup::queryAggregation( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ uno::Any aAny;
+
+ QUERYINT( drawing::XShapeGroup );
+ else QUERYINT( drawing::XShapes );
+ else QUERYINT( container::XIndexAccess );
+ else QUERYINT( container::XElementAccess );
+ else
+ SvxShape::queryAggregation( rType, aAny );
+
+ return aAny;
+}
+
+void SAL_CALL SvxShapeGroup::acquire() throw ( )
+{
+ SvxShape::acquire();
+}
+
+void SAL_CALL SvxShapeGroup::release() throw ( )
+{
+ SvxShape::release();
+}
+
+uno::Sequence< uno::Type > SAL_CALL SvxShapeGroup::getTypes()
+ throw (uno::RuntimeException)
+{
+ return SvxShape::getTypes();
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL SvxShapeGroup::getImplementationId()
+ throw (uno::RuntimeException)
+{
+ static uno::Sequence< sal_Int8 > aId;
+ if( aId.getLength() == 0 )
+ {
+ aId.realloc( 16 );
+ rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
+ }
+ return aId;
+}
+
+//----------------------------------------------------------------------
+OUString SAL_CALL SvxShapeGroup::getShapeType()
+ throw( uno::RuntimeException )
+{
+ return SvxShape::getShapeType();
+}
+
+//------------------------------------------------------------------1----
+awt::Point SAL_CALL SvxShapeGroup::getPosition() throw(uno::RuntimeException)
+{
+ return SvxShape::getPosition();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeGroup::setPosition( const awt::Point& Position ) throw(uno::RuntimeException)
+{
+ SvxShape::setPosition(Position);
+}
+
+//----------------------------------------------------------------------
+
+awt::Size SAL_CALL SvxShapeGroup::getSize() throw(uno::RuntimeException)
+{
+ return SvxShape::getSize();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeGroup::setSize( const awt::Size& rSize )
+ throw(beans::PropertyVetoException, uno::RuntimeException)
+{
+ SvxShape::setSize( rSize );
+}
+
+// drawing::XShapeGroup
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeGroup::enterGroup( ) throw(uno::RuntimeException)
+{
+ // Todo
+// pDrView->EnterMarkedGroup();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeGroup::leaveGroup( ) throw(uno::RuntimeException)
+{
+ // Todo
+// pDrView->LeaveOneGroup();
+}
+
+//----------------------------------------------------------------------
+
+// XShapes
+void SAL_CALL SvxShapeGroup::add( const uno::Reference< drawing::XShape >& xShape )
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ SvxShape* pShape = SvxShape::getImplementation( xShape );
+
+ if( pObj != NULL && pPage != NULL && pShape != NULL )
+ {
+ SdrObject* pSdrShape = pShape->GetSdrObject();
+ if( pSdrShape == NULL )
+ pSdrShape = pPage->_CreateSdrObject( xShape );
+
+ if( pSdrShape->IsInserted() )
+ pSdrShape->GetObjList()->RemoveObject( pSdrShape->GetOrdNum() );
+
+ pObj->GetSubList()->InsertObject( pSdrShape );
+
+ // #85922# It makes no sense to set the layer asked
+ // from the group object since these is an iteration
+ // over the contained objects. In consequence, this
+ // statement erases all layer information from the draw
+ // objects. Layers need to be set at draw objects directly
+ // and have nothing to do with grouping at all.
+ // pSdrShape->SetLayer(pObj->GetLayer());
+
+ if(pShape)
+ pShape->Create( pSdrShape, pPage );
+
+ if( pModel )
+ pModel->SetChanged();
+ }
+ else
+ {
+ DBG_ERROR("could not add XShape to group shape!");
+ }
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeGroup::remove( const uno::Reference< drawing::XShape >& xShape )
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ SdrObject* pSdrShape = NULL;
+ SvxShape* pShape = SvxShape::getImplementation( xShape );
+
+ if( pShape )
+ pSdrShape = pShape->GetSdrObject();
+
+ if(pObj == NULL || pSdrShape == NULL || pSdrShape->GetObjList()->GetOwnerObj() != pObj )
+ throw uno::RuntimeException();
+
+ SdrObjList& rList = *pSdrShape->GetObjList();
+
+ const sal_uInt32 nObjCount = rList.GetObjCount();
+ sal_uInt32 nObjNum = 0;
+ while( nObjNum < nObjCount )
+ {
+ if(rList.GetObj( nObjNum ) == pSdrShape )
+ break;
+ nObjNum++;
+ }
+
+ if( nObjNum < nObjCount )
+ {
+ delete rList.NbcRemoveObject( nObjNum );
+ pShape->InvalidateSdrObject();
+ }
+ else
+ {
+ DBG_ASSERT( 0, "Fatality! SdrObject is not belonging to its SdrObjList! [CL]" );
+ }
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+// XIndexAccess
+
+//----------------------------------------------------------------------
+sal_Int32 SAL_CALL SvxShapeGroup::getCount() throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ sal_Int32 nRetval = 0;
+
+ if(pObj && pObj->GetSubList())
+ nRetval = pObj->GetSubList()->GetObjCount();
+ else
+ throw uno::RuntimeException();
+
+ return nRetval;
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL SvxShapeGroup::getByIndex( sal_Int32 Index )
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ if( pObj == NULL || pObj->GetSubList() == NULL )
+ throw uno::RuntimeException();
+
+
+ if( pObj->GetSubList()->GetObjCount() <= (sal_uInt32)Index )
+ throw lang::IndexOutOfBoundsException();
+
+ SdrObject* pDestObj = pObj->GetSubList()->GetObj( Index );
+
+ if(pDestObj == NULL)
+ throw lang::IndexOutOfBoundsException();
+
+ Reference< drawing::XShape > xShape( pDestObj->getUnoShape(), uno::UNO_QUERY );
+ uno::Any aAny;
+ aAny <<= xShape;
+ return aAny;
+}
+
+// ::com::sun::star::container::XElementAccess
+
+//----------------------------------------------------------------------
+uno::Type SAL_CALL SvxShapeGroup::getElementType() throw( uno::RuntimeException )
+{
+ return ::getCppuType(( const Reference< drawing::XShape >*)0);
+}
+
+//----------------------------------------------------------------------
+sal_Bool SAL_CALL SvxShapeGroup::hasElements() throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ return pObj && pObj->GetSubList() && (pObj->GetSubList()->GetObjCount() > 0);
+}
+
+//----------------------------------------------------------------------
+// ::com::sun::star::lang::XServiceInfo
+
+uno::Sequence< OUString > SAL_CALL SvxShapeGroup::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ return SvxShape::getSupportedServiceNames();
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+SvxShapeConnector::SvxShapeConnector( SdrObject* pSdrObj ) throw() :
+ SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_CONNECTOR) )
+{
+}
+
+//----------------------------------------------------------------------
+SvxShapeConnector::~SvxShapeConnector() throw()
+{
+}
+
+//----------------------------------------------------------------------
+
+uno::Any SAL_CALL SvxShapeConnector::queryInterface( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ return SvxShapeText::queryInterface( rType );
+}
+
+uno::Any SAL_CALL SvxShapeConnector::queryAggregation( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ uno::Any aAny;
+
+ QUERYINT( drawing::XConnectorShape );
+ else
+ return SvxShapeText::queryAggregation( rType );
+
+ return aAny;
+}
+
+void SAL_CALL SvxShapeConnector::acquire() throw ( )
+{
+ SvxShapeText::acquire();
+}
+
+void SAL_CALL SvxShapeConnector::release() throw ( )
+{
+ SvxShapeText::release();
+}
+// XTypeProvider
+
+uno::Sequence< uno::Type > SAL_CALL SvxShapeConnector::getTypes()
+ throw (uno::RuntimeException)
+{
+ return SvxShape::getTypes();
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL SvxShapeConnector::getImplementationId()
+ throw (uno::RuntimeException)
+{
+ static uno::Sequence< sal_Int8 > aId;
+ if( aId.getLength() == 0 )
+ {
+ aId.realloc( 16 );
+ rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
+ }
+ return aId;
+}
+
+// ::com::sun::star::drawing::XShape
+
+//----------------------------------------------------------------------
+OUString SAL_CALL SvxShapeConnector::getShapeType()
+ throw( uno::RuntimeException )
+{
+ return SvxShapeText::getShapeType();
+}
+
+//------------------------------------------------------------------1----
+awt::Point SAL_CALL SvxShapeConnector::getPosition() throw(uno::RuntimeException)
+{
+ return SvxShapeText::getPosition();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeConnector::setPosition( const awt::Point& Position ) throw(uno::RuntimeException)
+{
+ SvxShapeText::setPosition(Position);
+}
+
+//----------------------------------------------------------------------
+
+awt::Size SAL_CALL SvxShapeConnector::getSize() throw(uno::RuntimeException)
+{
+ return SvxShapeText::getSize();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeConnector::setSize( const awt::Size& rSize )
+ throw(beans::PropertyVetoException, uno::RuntimeException)
+{
+ SvxShapeText::setSize( rSize );
+}
+
+//----------------------------------------------------------------------
+
+// XConnectorShape
+
+void SAL_CALL SvxShapeConnector::connectStart( const uno::Reference< drawing::XConnectableShape >& xShape, drawing::ConnectionType nPos ) throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ Reference< drawing::XShape > xRef( xShape, UNO_QUERY );
+ SvxShape* pShape = SvxShape::getImplementation( xRef );
+
+ if( pShape )
+ pObj->ConnectToNode( sal_True, pShape->pObj );
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeConnector::connectEnd( const uno::Reference< drawing::XConnectableShape >& xShape, drawing::ConnectionType nPos )
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ Reference< drawing::XShape > xRef( xShape, UNO_QUERY );
+ SvxShape* pShape = SvxShape::getImplementation( xRef );
+
+ if( pObj && pShape )
+ pObj->ConnectToNode( sal_False, pShape->pObj );
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeConnector::disconnectBegin( const uno::Reference< drawing::XConnectableShape >& xShape )
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj)
+ pObj->DisconnectFromNode( sal_True );
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeConnector::disconnectEnd( const uno::Reference< drawing::XConnectableShape >& xShape )
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj)
+ pObj->DisconnectFromNode( sal_False );
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+//----------------------------------------------------------------------
+// ::com::sun::star::lang::XServiceInfo
+//----------------------------------------------------------------------
+uno::Sequence< OUString > SAL_CALL SvxShapeConnector::getSupportedServiceNames() throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+/***********************************************************************
+* class SvxShapeControl *
+***********************************************************************/
+
+
+SvxShapeControl::SvxShapeControl( SdrObject* pSdrObj ) throw() :
+ SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_CONTROL) )
+{
+ setShapeKind( OBJ_UNO );
+}
+
+//----------------------------------------------------------------------
+SvxShapeControl::~SvxShapeControl() throw()
+{
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL SvxShapeControl::queryInterface( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ return SvxShapeText::queryInterface( rType );
+}
+
+uno::Any SAL_CALL SvxShapeControl::queryAggregation( const uno::Type & rType )
+ throw(uno::RuntimeException)
+{
+ uno::Any aAny;
+
+ QUERYINT( drawing::XControlShape );
+ else
+ return SvxShapeText::queryAggregation( rType );
+
+ return aAny;
+}
+
+void SAL_CALL SvxShapeControl::acquire() throw ( )
+{
+ SvxShapeText::acquire();
+}
+
+void SAL_CALL SvxShapeControl::release() throw ( )
+{
+ SvxShapeText::release();
+}
+// XTypeProvider
+
+uno::Sequence< uno::Type > SAL_CALL SvxShapeControl::getTypes()
+ throw (uno::RuntimeException)
+{
+ return SvxShape::getTypes();
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL SvxShapeControl::getImplementationId()
+ throw (uno::RuntimeException)
+{
+ static uno::Sequence< sal_Int8 > aId;
+ if( aId.getLength() == 0 )
+ {
+ aId.realloc( 16 );
+ rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
+ }
+ return aId;
+}
+
+// ::com::sun::star::drawing::XShape
+
+//----------------------------------------------------------------------
+OUString SAL_CALL SvxShapeControl::getShapeType()
+ throw( uno::RuntimeException )
+{
+ return SvxShapeText::getShapeType();
+}
+
+//------------------------------------------------------------------1----
+awt::Point SAL_CALL SvxShapeControl::getPosition() throw(uno::RuntimeException)
+{
+ return SvxShapeText::getPosition();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeControl::setPosition( const awt::Point& Position ) throw(uno::RuntimeException)
+{
+ SvxShapeText::setPosition(Position);
+}
+
+//----------------------------------------------------------------------
+
+awt::Size SAL_CALL SvxShapeControl::getSize() throw(uno::RuntimeException)
+{
+ return SvxShapeText::getSize();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeControl::setSize( const awt::Size& rSize )
+ throw(beans::PropertyVetoException, uno::RuntimeException)
+{
+ SvxShapeText::setSize( rSize );
+}
+
+//----------------------------------------------------------------------
+// XControlShape
+
+Reference< awt::XControlModel > SAL_CALL SvxShapeControl::getControl()
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ Reference< awt::XControlModel > xModel;
+
+ SdrUnoObj* pUnoObj = PTR_CAST(SdrUnoObj, pObj);
+ if( pUnoObj )
+ xModel = pUnoObj->GetUnoControlModel();
+
+ return xModel;
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapeControl::setControl( const Reference< awt::XControlModel >& xControl )
+ throw( uno::RuntimeException )
+{
+ ::SolarMutexGuard aGuard;
+
+ SdrUnoObj* pUnoObj = PTR_CAST(SdrUnoObj, pObj);
+ if( pUnoObj )
+ pUnoObj->SetUnoControlModel( xControl );
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+// XServiceInfo
+uno::Sequence< OUString > SAL_CALL SvxShapeControl::getSupportedServiceNames() throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+static struct
+{
+ const sal_Char* mpAPIName;
+ sal_uInt16 mnAPINameLen;
+
+ const sal_Char* mpFormName;
+ sal_uInt16 mnFormNameLen;
+}
+SvxShapeControlPropertyMapping[] =
+{
+ // Warning: The first entry must be FontSlant because the any needs to be converted
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_POSTURE), MAP_CHAR_LEN("FontSlant") }, // const sal_Int16 => ::com::sun::star::awt::FontSlant
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_FONTNAME), MAP_CHAR_LEN("FontName") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_FONTSTYLENAME), MAP_CHAR_LEN("FontStyleName") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_FONTFAMILY), MAP_CHAR_LEN("FontFamily") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_FONTCHARSET), MAP_CHAR_LEN("FontCharset") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_HEIGHT), MAP_CHAR_LEN("FontHeight") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_FONTPITCH), MAP_CHAR_LEN("FontPitch" ) },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_WEIGHT), MAP_CHAR_LEN("FontWeight" ) },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_UNDERLINE), MAP_CHAR_LEN("FontUnderline") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_STRIKEOUT), MAP_CHAR_LEN("FontStrikeout") },
+ { MAP_CHAR_LEN("CharKerning"), MAP_CHAR_LEN("FontKerning") },
+ { MAP_CHAR_LEN("CharWordMode"), MAP_CHAR_LEN("FontWordLineMode" ) },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_COLOR), MAP_CHAR_LEN("TextColor") },
+ { MAP_CHAR_LEN("CharRelief"), MAP_CHAR_LEN("FontRelief") },
+ { MAP_CHAR_LEN("CharUnderlineColor"), MAP_CHAR_LEN("TextLineColor") },
+ { MAP_CHAR_LEN(UNO_NAME_EDIT_PARA_ADJUST), MAP_CHAR_LEN("Align") },
+ { MAP_CHAR_LEN("ControlBackground"), MAP_CHAR_LEN("BackgroundColor") },
+ { MAP_CHAR_LEN("ControlBorder"), MAP_CHAR_LEN("Border") },
+ { MAP_CHAR_LEN("ControlTextEmphasis"), MAP_CHAR_LEN("FontEmphasisMark") },
+ { NULL,0, NULL, 0 }
+};
+
+void SvxShapeControl::convertPropertyName( const OUString& rApiName, OUString& rInternalName, sal_Bool& rNeedsConversion )
+{
+ sal_uInt16 i = 0;
+ while( SvxShapeControlPropertyMapping[i].mpAPIName )
+ {
+ if( rApiName.reverseCompareToAsciiL( SvxShapeControlPropertyMapping[i].mpAPIName, SvxShapeControlPropertyMapping[i].mnAPINameLen ) == 0 )
+ {
+ rInternalName = OUString( SvxShapeControlPropertyMapping[i].mpFormName, SvxShapeControlPropertyMapping[i].mnFormNameLen, RTL_TEXTENCODING_ASCII_US );
+ rNeedsConversion = i == 0;
+ }
+ i++;
+ }
+}
+
+//added by BerryJia for fixing Bug102407 2002-11-04
+static struct
+{
+ sal_Int16 nAPIValue;
+ sal_Int16 nFormValue;
+}
+SvxShapeControlPropertyValueMapping[] =
+{
+ // note that order matters:
+ // valueAlignToParaAdjust and valueParaAdjustToAlign search this map from the _beginning_
+ // and use the first matching entry
+ {style::ParagraphAdjust_LEFT, (sal_Int16)awt::TextAlign::LEFT},
+ {style::ParagraphAdjust_CENTER, (sal_Int16)awt::TextAlign::CENTER},
+ {style::ParagraphAdjust_RIGHT, (sal_Int16)awt::TextAlign::RIGHT},
+ {style::ParagraphAdjust_BLOCK, (sal_Int16)awt::TextAlign::RIGHT},
+ {style::ParagraphAdjust_STRETCH, (sal_Int16)awt::TextAlign::LEFT},
+ {style::ParagraphAdjust_MAKE_FIXED_SIZE,(sal_Int16)awt::TextAlign::LEFT},
+ {-1,-1}
+};
+
+void SvxShapeControl::valueAlignToParaAdjust(Any& rValue)
+{
+ sal_Int16 nValue;
+ rValue >>= nValue;
+ sal_uInt16 i = 0;
+ while (-1 != SvxShapeControlPropertyValueMapping[i].nFormValue)
+ {
+ if (nValue == SvxShapeControlPropertyValueMapping[i].nFormValue)
+ {
+ rValue <<= (SvxShapeControlPropertyValueMapping[i].nAPIValue);
+ return;
+ }
+ i++;
+ }
+}
+
+void SvxShapeControl::valueParaAdjustToAlign(Any& rValue)
+{
+ sal_Int32 nValue;
+ rValue >>= nValue;
+ sal_uInt16 i = 0;
+ while (-1 != SvxShapeControlPropertyValueMapping[i].nAPIValue)
+ {
+ if ( nValue == SvxShapeControlPropertyValueMapping[i].nAPIValue)
+ {
+ rValue <<= (SvxShapeControlPropertyValueMapping[i].nFormValue);
+ return;
+ }
+ i++;
+ }
+}
+
+void SAL_CALL SvxShapeControl::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException)
+{
+ OUString aFormsName;
+ sal_Bool bNeedConversion;
+
+ convertPropertyName( aPropertyName, aFormsName, bNeedConversion );
+ if( aFormsName.getLength() )
+ {
+ uno::Reference< beans::XPropertySet > xControl( getControl(), uno::UNO_QUERY );
+ if( xControl.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xInfo( xControl->getPropertySetInfo() );
+ if( xInfo.is() && xInfo->hasPropertyByName( aFormsName ) )
+ {
+ if( bNeedConversion )
+ {
+ awt::FontSlant nSlant;
+ if( !(aValue >>= nSlant ) )
+ throw lang::IllegalArgumentException();
+
+ xControl->setPropertyValue( aFormsName, uno::makeAny( (sal_Int16)nSlant ) );
+ }
+ else
+ {
+ //modified by BerryJia for fixing Bug102407 2002-11-4
+ Any rValue;
+ rValue = aValue;
+ if (::rtl::OUString::createFromAscii("Align") == aFormsName)
+ valueParaAdjustToAlign(rValue);
+ xControl->setPropertyValue( aFormsName, rValue );
+ }
+ }
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue( aPropertyName, aValue );
+ }
+}
+
+uno::Any SAL_CALL SvxShapeControl::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ OUString aFormsName;
+ sal_Bool bNeedConversion;
+
+ convertPropertyName( aPropertyName, aFormsName, bNeedConversion );
+ if( aFormsName.getLength() )
+ {
+ uno::Reference< beans::XPropertySet > xControl( getControl(), uno::UNO_QUERY );
+
+ if( xControl.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xInfo( xControl->getPropertySetInfo() );
+ if( xInfo.is() && xInfo->hasPropertyByName( aFormsName ) )
+ {
+ if( bNeedConversion )
+ {
+ sal_Int16 nSlant;
+ xControl->getPropertyValue( aFormsName ) >>= nSlant;
+ return uno::makeAny( (awt::FontSlant)nSlant );
+ }
+ else
+ {
+ //modified by BerryJia for fixing Bug102407 2002-11-4
+ Any rValue;
+ rValue = xControl->getPropertyValue( aFormsName );
+ if (::rtl::OUString::createFromAscii("Align") == aFormsName)
+ valueAlignToParaAdjust(rValue);
+ return rValue;
+ }
+ }
+ }
+
+ uno::Any aAny;
+ return aAny;
+ }
+ else
+ {
+ return SvxShape::getPropertyValue( aPropertyName );
+ }
+
+}
+
+// XPropertyState
+beans::PropertyState SAL_CALL SvxShapeControl::getPropertyState( const ::rtl::OUString& PropertyName ) throw( beans::UnknownPropertyException, uno::RuntimeException )
+{
+ OUString aFormsName;
+ sal_Bool bNeedConversion;
+
+ convertPropertyName( PropertyName, aFormsName, bNeedConversion );
+ if( aFormsName.getLength() )
+ {
+ uno::Reference< beans::XPropertyState > xControl( getControl(), uno::UNO_QUERY );
+ uno::Reference< beans::XPropertySet > xPropSet( getControl(), uno::UNO_QUERY );
+
+ if( xControl.is() && xPropSet.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xInfo( xPropSet->getPropertySetInfo() );
+ if( xInfo.is() && xInfo->hasPropertyByName( aFormsName ) )
+ {
+ return xControl->getPropertyState( aFormsName );
+ }
+ }
+
+ return beans::PropertyState_DEFAULT_VALUE;
+ }
+ else
+ {
+ return SvxShape::getPropertyState( PropertyName );
+ }
+}
+
+void SAL_CALL SvxShapeControl::setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw( beans::UnknownPropertyException, uno::RuntimeException )
+{
+ OUString aFormsName;
+ sal_Bool bNeedConversion;
+
+ convertPropertyName( PropertyName, aFormsName, bNeedConversion );
+ if( aFormsName.getLength() )
+ {
+ uno::Reference< beans::XPropertyState > xControl( getControl(), uno::UNO_QUERY );
+ uno::Reference< beans::XPropertySet > xPropSet( getControl(), uno::UNO_QUERY );
+
+ if( xControl.is() && xPropSet.is() )
+ {
+ uno::Reference< beans::XPropertySetInfo > xInfo( xPropSet->getPropertySetInfo() );
+ if( xInfo.is() && xInfo->hasPropertyByName( aFormsName ) )
+ {
+ xControl->setPropertyToDefault( aFormsName );
+ }
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyToDefault( PropertyName );
+ }
+}
+
+uno::Any SAL_CALL SvxShapeControl::getPropertyDefault( const ::rtl::OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ OUString aFormsName;
+ sal_Bool bNeedConversion;
+
+ convertPropertyName( aPropertyName, aFormsName, bNeedConversion );
+ if( aFormsName.getLength() )
+ {
+ uno::Reference< beans::XPropertyState > xControl( getControl(), uno::UNO_QUERY );
+
+ if( xControl.is() )
+ {
+ if( bNeedConversion )
+ {
+ sal_Int16 nSlant;
+ xControl->getPropertyDefault( aFormsName ) >>= nSlant;
+
+ return uno::makeAny( (awt::FontSlant)nSlant );
+ }
+ else
+ {
+ return xControl->getPropertyDefault( aFormsName );
+ }
+ }
+
+ throw beans::UnknownPropertyException();
+ }
+ else
+ {
+ return SvxShape::getPropertyDefault( aPropertyName );
+ }
+}
+
+
+/***********************************************************************
+* class SvxShapeDimensioning *
+***********************************************************************/
+
+//----------------------------------------------------------------------
+SvxShapeDimensioning::SvxShapeDimensioning( SdrObject* pSdrObj ) throw()
+: SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_DIMENSIONING) )
+{
+}
+
+//----------------------------------------------------------------------
+SvxShapeDimensioning::~SvxShapeDimensioning() throw()
+{
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL SvxShapeDimensioning::getSupportedServiceNames() throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+
+//----------------------------------------------------------------------
+SvxShapeCircle::SvxShapeCircle( SdrObject* pSdrObj ) throw()
+: SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_CIRCLE) )
+{
+}
+
+//----------------------------------------------------------------------
+SvxShapeCircle::~SvxShapeCircle() throw()
+{
+}
+
+// ::com::sun::star::lang::XServiceInfo
+// XServiceInfo
+uno::Sequence< OUString > SAL_CALL SvxShapeCircle::getSupportedServiceNames() throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+/***********************************************************************
+* *
+***********************************************************************/
+}//namespace binfilter
+#include "svdopath.hxx"
+namespace binfilter {//STRIP009
+//----------------------------------------------------------------------
+SvxShapePolyPolygon::SvxShapePolyPolygon( SdrObject* pSdrObj , drawing::PolygonKind eNew )
+ throw( ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException)
+: SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_POLYPOLYGON) ),
+ ePolygonKind( eNew )
+{
+}
+
+//----------------------------------------------------------------------
+SvxShapePolyPolygon::~SvxShapePolyPolygon() throw()
+{
+}
+
+void SAL_CALL ImplSvxPolyPolygonToPointSequenceSequence( const drawing::PointSequenceSequence* pOuterSequence, XPolyPolygon& rNewPolyPolygon ) throw()
+{
+ // Koordinaten in das PolyPolygon packen
+ // Zeiger auf innere sequences holen
+ const drawing::PointSequence* pInnerSequence = pOuterSequence->getConstArray();
+ const drawing::PointSequence* pInnerSeqEnd = pInnerSequence + pOuterSequence->getLength();
+
+ // #85920# Clear the given polygon, since the new one shall be SET, not ADDED
+ rNewPolyPolygon.Clear();
+
+ for(;pInnerSequence != pInnerSeqEnd;++pInnerSequence)
+ {
+ sal_Int32 nInnerSequenceCount = pInnerSequence->getLength();
+
+ // Neues XPolygon vorbereiten
+ XPolygon aNewPolygon((USHORT)nInnerSequenceCount);
+
+ // Zeiger auf Arrays holen
+ const awt::Point* pArray = pInnerSequence->getConstArray();
+ const awt::Point* pArrayEnd = pArray + nInnerSequenceCount;
+
+ for(USHORT b=0;pArray != pArrayEnd;++b,++pArray)
+ {
+ Point& rPoint = aNewPolygon[b];
+ rPoint.X() = pArray->X;
+ rPoint.Y() = pArray->Y;
+ }
+
+ // Neues Teilpolygon einfuegen
+ rNewPolyPolygon.Insert(aNewPolygon);
+ }
+}
+
+//----------------------------------------------------------------------
+
+void SAL_CALL SvxShapePolyPolygon::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException)
+{
+ ::SolarMutexGuard aGuard;
+
+ if( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYPOLYGON)))
+ {
+ if( !aValue.getValue() || aValue.getValueType() != ::getCppuType((const drawing::PointSequenceSequence*)0) )
+ throw lang::IllegalArgumentException();
+
+ XPolyPolygon aNewPolyPolygon;
+
+ ImplSvxPolyPolygonToPointSequenceSequence( (drawing::PointSequenceSequence*)aValue.getValue(), aNewPolyPolygon );
+
+ SetPolygon(aNewPolyPolygon);
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Geometry")))
+ {
+ if( !aValue.getValue() || aValue.getValueType() != ::getCppuType((const drawing::PointSequenceSequence*)0) )
+ throw lang::IllegalArgumentException();
+
+ if( pObj )
+ {
+ XPolyPolygon aNewPolyPolygon;
+ Matrix3D aMatrix3D;
+
+ pObj->TRGetBaseGeometry(aMatrix3D, aNewPolyPolygon);
+
+ ImplSvxPolyPolygonToPointSequenceSequence( (drawing::PointSequenceSequence*)aValue.getValue(), aNewPolyPolygon );
+
+ pObj->TRSetBaseGeometry(aMatrix3D, aNewPolyPolygon);
+ }
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYGON)))
+ {
+ drawing::PointSequence* pSequence = (drawing::PointSequence*)aValue.getValue();
+
+ if( !pSequence || aValue.getValueType() != ::getCppuType((const drawing::PointSequence*)0 ) )
+ throw lang::IllegalArgumentException();
+
+ // Koordinaten in das PolyPolygon packen
+ const sal_Int32 nSequenceCount = pSequence->getLength();
+
+ // Neues PolyPolygon vorbereiten
+ XPolyPolygon aNewPolyPolygon;
+
+ // Neues XPolygon vorbereiten
+ XPolygon aNewPolygon((USHORT)nSequenceCount);
+
+ // Zeiger auf Arrays holen
+ awt::Point* pArray = pSequence->getArray();
+
+ for(sal_Int32 b=0;b<nSequenceCount;b++)
+ {
+ aNewPolygon[(USHORT)b] = Point( pArray->X, pArray->Y );
+ pArray++;
+ }
+
+ // Neues Teilpolygon einfuegen
+ aNewPolyPolygon.Insert(aNewPolygon);
+
+ // Polygon setzen
+ SetPolygon(aNewPolyPolygon);
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+void SAL_CALL ImplSvxPointSequenceSequenceToPolyPolygon( const XPolyPolygon& rPolyPoly, drawing::PointSequenceSequence& rRetval )
+{
+ if( rRetval.getLength() != rPolyPoly.Count() )
+ rRetval.realloc( rPolyPoly.Count() );
+
+ // Zeiger auf aeussere Arrays holen
+ drawing::PointSequence* pOuterSequence = rRetval.getArray();
+
+ for(sal_uInt16 a=0;a<rPolyPoly.Count();a++)
+ {
+ // Einzelpolygon holen
+ const XPolygon& rPoly = rPolyPoly[a];
+
+ // Platz in Arrays schaffen
+ pOuterSequence->realloc((sal_Int32)rPoly.GetPointCount());
+
+ // Pointer auf arrays holen
+ awt::Point* pInnerSequence = pOuterSequence->getArray();
+
+ for(sal_uInt16 b=0;b<rPoly.GetPointCount();b++)
+ {
+ *pInnerSequence = awt::Point( rPoly[b].X(), rPoly[b].Y() );
+ pInnerSequence++;
+ }
+
+ pOuterSequence++;
+ }
+}
+
+//----------------------------------------------------------------------
+
+uno::Any SAL_CALL SvxShapePolyPolygon::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ ::SolarMutexGuard aGuard;
+
+ if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYPOLYGON)))
+ {
+ // PolyPolygon in eine struct PolyPolygon packen
+ const XPolyPolygon& rPolyPoly = GetPolygon();
+ drawing::PointSequenceSequence aRetval( rPolyPoly.Count() );
+
+ ImplSvxPointSequenceSequenceToPolyPolygon( rPolyPoly, aRetval );
+
+ return uno::Any( &aRetval, ::getCppuType((const drawing::PointSequenceSequence*)0) );
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Geometry")))
+ {
+ // PolyPolygon in eine struct PolyPolygon packen
+ XPolyPolygon aPolyPoly;
+ Matrix3D aMatrix3D;
+ if( pObj )
+ pObj->TRGetBaseGeometry( aMatrix3D, aPolyPoly );
+
+ drawing::PointSequenceSequence aRetval( aPolyPoly.Count() );
+
+ ImplSvxPointSequenceSequenceToPolyPolygon( aPolyPoly, aRetval );
+
+ return uno::Any( &aRetval, ::getCppuType((const drawing::PointSequenceSequence*)0) );
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYGON)))
+ {
+ // PolyPolygon in eine struct PolyPolygon packen
+ const XPolyPolygon& rPolyPoly = GetPolygon();
+
+ sal_Int32 nCount = 0;
+ if( rPolyPoly.Count() > 0 )
+ nCount = rPolyPoly[0].GetPointCount();
+
+ drawing::PointSequence aRetval( nCount );
+
+ if( nCount > 0 )
+ {
+ // Einzelpolygon holen
+ const XPolygon& rPoly = rPolyPoly[0];
+
+ // Pointer auf arrays holen
+ awt::Point* pSequence = aRetval.getArray();
+
+ for(sal_Int32 b=0;b<nCount;b++)
+ *pSequence++ = awt::Point( rPoly[(USHORT)b].X(), rPoly[(USHORT)b].Y() );
+ }
+
+ return uno::Any( &aRetval, ::getCppuType((const drawing::PointSequence*)0) );
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYGONKIND)))
+ {
+ drawing::PolygonKind ePT = GetPolygonKind();
+ return Any( &ePT, ::getCppuType((const drawing::PolygonKind*)0) );
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+//----------------------------------------------------------------------
+drawing::PolygonKind SvxShapePolyPolygon::GetPolygonKind() const throw()
+{
+ return ePolygonKind;
+}
+
+//----------------------------------------------------------------------
+void SvxShapePolyPolygon::SetPolygon(const XPolyPolygon& rNew) throw()
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj)
+ ((SdrPathObj*)pObj)->SetPathPoly(rNew);
+}
+
+//----------------------------------------------------------------------
+const XPolyPolygon& SvxShapePolyPolygon::GetPolygon() const throw()
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj)
+ return ((SdrPathObj*)pObj)->GetPathPoly();
+ return aEmptyPoly;
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL SvxShapePolyPolygon::getSupportedServiceNames() throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+/***********************************************************************
+* class SvxShapePolyPolygonBezier *
+***********************************************************************/
+}
+#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
+#include <com/sun/star/drawing/FlagSequence.hpp>
+namespace binfilter {//STRIP009
+//----------------------------------------------------------------------
+SvxShapePolyPolygonBezier::SvxShapePolyPolygonBezier( SdrObject* pSdrObj , drawing::PolygonKind eNew ) throw()
+: SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_POLYPOLYGONBEZIER) ),
+ ePolygonKind( eNew )
+{
+}
+
+//----------------------------------------------------------------------
+SvxShapePolyPolygonBezier::~SvxShapePolyPolygonBezier() throw()
+{
+}
+
+void SAL_CALL ImplSvxPolyPolygonBezierCoordsToPolyPolygon( drawing::PolyPolygonBezierCoords* pSourcePolyPolygon, XPolyPolygon& rNewPolyPolygon )
+ throw( IllegalArgumentException )
+{
+ sal_Int32 nOuterSequenceCount = pSourcePolyPolygon->Coordinates.getLength();
+ if(pSourcePolyPolygon->Flags.getLength() != nOuterSequenceCount)
+ throw IllegalArgumentException();
+
+ // Zeiger auf innere sequences holen
+ const drawing::PointSequence* pInnerSequence = pSourcePolyPolygon->Coordinates.getConstArray();
+ const drawing::FlagSequence* pInnerSequenceFlags = pSourcePolyPolygon->Flags.getConstArray();
+ sal_Bool bIsCurve(FALSE);
+ sal_Bool bCurveValid(TRUE);
+ sal_Bool bCurveTestActive(FALSE);
+
+ for(sal_Int32 a(0); bCurveValid && a < nOuterSequenceCount; a++)
+ {
+ sal_Int32 nInnerSequenceCount = pInnerSequence->getLength();
+
+ if(pInnerSequenceFlags->getLength() != nInnerSequenceCount)
+ throw IllegalArgumentException();
+
+ // Neues XPolygon vorbereiten
+ XPolygon aNewPolygon((USHORT)nInnerSequenceCount);
+
+ // Zeiger auf Arrays holen
+ const awt::Point* pArray = pInnerSequence->getConstArray();
+ const drawing::PolygonFlags* pArrayFlags = pInnerSequenceFlags->getConstArray();
+
+ for(sal_Int32 b(0); bCurveValid && b < nInnerSequenceCount; b++)
+ {
+ // coordinate data
+ aNewPolygon[(USHORT)b] = Point( pArray->X, pArray->Y );
+ pArray++;
+
+ // flag data
+ XPolyFlags ePolyFlag = (XPolyFlags)((sal_uInt16)*pArrayFlags++);
+
+ // set curve flag
+ if(!bIsCurve && ePolyFlag == XPOLY_CONTROL)
+ bIsCurve = TRUE;
+
+ // curve testing
+ if(bIsCurve && bCurveValid && (bCurveTestActive || ePolyFlag == XPOLY_CONTROL))
+ {
+ if(!bCurveTestActive)
+ {
+ // first control point found, test it
+ if(b == 0)
+ {
+ // no curve startpoint possible
+ bCurveValid = FALSE;
+ }
+ else
+ {
+ // test type of prev point
+ XPolyFlags ePrevPolyFlag = (XPolyFlags)((sal_uInt16)*(pArrayFlags - 2));
+ if(ePrevPolyFlag == XPOLY_CONTROL)
+ {
+ // curve startpoint is a control point,
+ // this is not allowed (three control points in a row)
+ bCurveValid = FALSE;
+ }
+ }
+
+ // next curve test state
+ bCurveTestActive = TRUE;
+ }
+ else
+ {
+ // prev was a valid curve start, this should be the second
+ // curve control point, test it
+ if(ePolyFlag != XPOLY_CONTROL)
+ {
+ // no second curve control point
+ bCurveValid = FALSE;
+ }
+ else if(b == nInnerSequenceCount-1)
+ {
+ // no curve endpoint possible
+ bCurveValid = FALSE;
+ }
+ else
+ {
+ // test type of next point
+ XPolyFlags eNextPolyFlag = (XPolyFlags)((sal_uInt16)*pArrayFlags);
+ if(eNextPolyFlag == XPOLY_CONTROL)
+ {
+ // curve endpoint is the next control point,
+ // this is not allowed (three control points in a row)
+ bCurveValid = FALSE;
+ }
+ }
+
+ // end curve test for this segment
+ bCurveTestActive = FALSE;
+ }
+ }
+
+ aNewPolygon.SetFlags((USHORT)b, ePolyFlag);
+ }
+
+ pInnerSequence++;
+ pInnerSequenceFlags++;
+
+ // Neues Teilpolygon einfuegen
+ rNewPolyPolygon.Insert(aNewPolygon);
+ }
+
+ // throw exception if polygon data is an invalid curve definition
+ if(bIsCurve && !bCurveValid)
+ throw IllegalArgumentException();
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxShapePolyPolygonBezier::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException )
+{
+ ::SolarMutexGuard aGuard;
+
+ if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYPOLYGONBEZIER)))
+ {
+ if( !aValue.getValue() || aValue.getValueType() != ::getCppuType((const drawing::PolyPolygonBezierCoords*)0) )
+ throw IllegalArgumentException();
+
+ XPolyPolygon aNewPolyPolygon;
+ ImplSvxPolyPolygonBezierCoordsToPolyPolygon( (drawing::PolyPolygonBezierCoords*)aValue.getValue(), aNewPolyPolygon );
+ SetPolygon(aNewPolyPolygon);
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Geometry")))
+ {
+ if( !aValue.getValue() || aValue.getValueType() != ::getCppuType((const drawing::PolyPolygonBezierCoords*)0) )
+ throw IllegalArgumentException();
+
+ if( pObj )
+ {
+ Matrix3D aMatrix3D;
+ XPolyPolygon aNewPolyPolygon;
+
+ pObj->TRGetBaseGeometry(aMatrix3D, aNewPolyPolygon);
+ ImplSvxPolyPolygonBezierCoordsToPolyPolygon( (drawing::PolyPolygonBezierCoords*)aValue.getValue(), aNewPolyPolygon );
+ pObj->TRSetBaseGeometry(aMatrix3D, aNewPolyPolygon);
+ }
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+
+ if( pModel )
+ pModel->SetChanged();
+}
+
+void SAL_CALL ImplSvxPolyPolygonToPolyPolygonBezierCoords( const XPolyPolygon& rPolyPoly, drawing::PolyPolygonBezierCoords& rRetval )
+{
+ // Polygone innerhalb vrobereiten
+ rRetval.Coordinates.realloc((sal_Int32)rPolyPoly.Count());
+ rRetval.Flags.realloc((sal_Int32)rPolyPoly.Count());
+
+ // Zeiger auf aeussere Arrays holen
+ drawing::PointSequence* pOuterSequence = rRetval.Coordinates.getArray();
+ drawing::FlagSequence* pOuterFlags = rRetval.Flags.getArray();
+
+ for(sal_uInt16 a=0;a<rPolyPoly.Count();a++)
+ {
+ // Einzelpolygon holen
+ const XPolygon& rPoly = rPolyPoly[a];
+
+ // Platz in Arrays schaffen
+ pOuterSequence->realloc((sal_Int32)rPoly.GetPointCount());
+ pOuterFlags->realloc((sal_Int32)rPoly.GetPointCount());
+
+ // Pointer auf arrays holen
+ awt::Point* pInnerSequence = pOuterSequence->getArray();
+ drawing::PolygonFlags* pInnerFlags = pOuterFlags->getArray();
+
+ for(sal_uInt16 b=0;b<rPoly.GetPointCount();b++)
+ {
+ *pInnerSequence++ = awt::Point( rPoly[b].X(), rPoly[b].Y() );
+ *pInnerFlags++ = (drawing::PolygonFlags)((sal_uInt16)rPoly.GetFlags(b));
+ }
+
+ pOuterSequence++;
+ pOuterFlags++;
+ }
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL SvxShapePolyPolygonBezier::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ ::SolarMutexGuard aGuard;
+ uno::Any aAny;
+
+ if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYPOLYGONBEZIER)))
+ {
+ // PolyPolygon in eine struct PolyPolygon packen
+ const XPolyPolygon& rPolyPoly = GetPolygon();
+ drawing::PolyPolygonBezierCoords aRetval;
+ ImplSvxPolyPolygonToPolyPolygonBezierCoords(rPolyPoly, aRetval );
+
+ aAny <<= aRetval;
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Geometry")))
+ {
+ if( pObj )
+ {
+ // PolyPolygon in eine struct PolyPolygon packen
+ XPolyPolygon aPolyPoly;
+ Matrix3D aMatrix3D;
+ pObj->TRGetBaseGeometry( aMatrix3D, aPolyPoly );
+
+ drawing::PolyPolygonBezierCoords aRetval;
+ ImplSvxPolyPolygonToPolyPolygonBezierCoords(aPolyPoly, aRetval );
+
+ aAny <<= aRetval;
+ }
+ }
+ else if(aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_POLYGONKIND)))
+ {
+ aAny <<= (drawing::PolygonKind)GetPolygonKind();
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+
+ return aAny;
+}
+
+//----------------------------------------------------------------------
+drawing::PolygonKind SvxShapePolyPolygonBezier::GetPolygonKind() const throw()
+{
+ return ePolygonKind;
+}
+
+//----------------------------------------------------------------------
+void SvxShapePolyPolygonBezier::SetPolygon(const XPolyPolygon& rNew) throw()
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj)
+ ((SdrPathObj*)pObj)->SetPathPoly(rNew);
+}
+
+//----------------------------------------------------------------------
+const XPolyPolygon& SvxShapePolyPolygonBezier::GetPolygon() const throw()
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj)
+ return ((SdrPathObj*)pObj)->GetPathPoly();
+ return aEmptyPoly;
+}
+
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL SvxShapePolyPolygonBezier::getSupportedServiceNames() throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+/***********************************************************************
+* class SvxGraphicObject *
+***********************************************************************/
+}
+#include <vcl/cvtgrf.hxx>
+#include <svdograf.hxx>
+#ifndef SVX_LIGHT
+#include <bf_sfx2/docfile.hxx>
+#include <bf_sfx2/app.hxx>
+#include <bf_sfx2/fcontnr.hxx>
+#endif
+
+#include "toolkit/unohlp.hxx"
+namespace binfilter {//STRIP009
+//----------------------------------------------------------------------
+SvxGraphicObject::SvxGraphicObject( SdrObject* pSdrObj ) throw()
+: SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_GRAPHICOBJECT) )
+{
+}
+
+//----------------------------------------------------------------------
+SvxGraphicObject::~SvxGraphicObject() throw()
+{
+}
+
+//----------------------------------------------------------------------
+void SAL_CALL SvxGraphicObject::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException)
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_FILLBITMAP)))
+ {
+ if( aValue.getValueType() == ::getCppuType(( const uno::Sequence< sal_Int8 >*)0) )
+ {
+ uno::Sequence<sal_Int8>* pSeq = (uno::Sequence<sal_Int8>*)aValue.getValue();
+ SvMemoryStream aMemStm;
+ Graphic aGraphic;
+
+ aMemStm.SetBuffer( (char*)pSeq->getConstArray(), pSeq->getLength(), sal_False, pSeq->getLength() );
+
+ if( GraphicConverter::Import( aMemStm, aGraphic ) == ERRCODE_NONE )
+ {
+ ((SdrGrafObj*)pObj)->SetGraphic(aGraphic);
+ }
+ }
+ else if( aValue.getValueType() == INTERFACE_TYPE( awt::XBitmap))
+ {
+ // Bitmap in das Objekt packen
+ Reference< awt::XBitmap > xBmp;
+ if( aValue >>= xBmp )
+ {
+ // Bitmap einsetzen
+ Graphic aGraphic(VCLUnoHelper::GetBitmap( xBmp ));
+ ((SdrGrafObj*)pObj)->SetGraphic(aGraphic);
+ }
+ }
+ }
+ else if( pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_GRAFURL)))
+ {
+ OUString aURL;
+ if(!(aValue >>= aURL))
+ throw lang::IllegalArgumentException();
+
+ if( aURL.compareToAscii( UNO_NAME_GRAPHOBJ_URLPREFIX, RTL_CONSTASCII_LENGTH( UNO_NAME_GRAPHOBJ_URLPREFIX ) ) == 0 )
+ {
+ // graphic manager url
+ aURL = aURL.copy( sizeof( UNO_NAME_GRAPHOBJ_URLPREFIX ) - 1 );
+ String aTmpStr(aURL);
+ ByteString aUniqueID( aTmpStr, RTL_TEXTENCODING_UTF8 );
+ BfGraphicObject aGrafObj( aUniqueID );
+
+ // #101808# since loading a graphic can cause a reschedule of the office
+ // it is possible that our shape is removed while where in this
+ // method.
+ if( pObj )
+ {
+ ((SdrGrafObj*)pObj)->ReleaseGraphicLink();
+ ((SdrGrafObj*)pObj)->SetGraphicObject( aGrafObj );
+ }
+ }
+ else if( aURL.compareToAscii( UNO_NAME_GRAPHOBJ_URLPKGPREFIX, RTL_CONSTASCII_LENGTH( UNO_NAME_GRAPHOBJ_URLPKGPREFIX ) ) != 0 )
+ {
+ // normal link
+ String aFilterName;
+ const SfxFilter* pSfxFilter = NULL;
+ SfxMedium aSfxMedium( aURL, STREAM_READ | STREAM_SHARE_DENYNONE, FALSE );
+
+ SFX_APP()->GetFilterMatcher().GuessFilter( aSfxMedium, &pSfxFilter, SFX_FILTER_IMPORT, SFX_FILTER_NOTINSTALLED | SFX_FILTER_EXECUTABLE );
+
+ if( !pSfxFilter )
+ {
+ INetURLObject aURLObj( aURL );
+
+ if( aURLObj.GetProtocol() == INET_PROT_NOT_VALID )
+ {
+ String aValidURL;
+
+ if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aURL, aValidURL ) )
+ aURLObj = INetURLObject( aValidURL );
+ }
+
+ if( aURLObj.GetProtocol() != INET_PROT_NOT_VALID )
+ {
+ GraphicFilter* pGrfFilter = GetGrfFilter();
+ aFilterName = pGrfFilter->GetImportFormatName( pGrfFilter->GetImportFormatNumberForShortName( aURLObj.getExtension() ) );
+ }
+ }
+ else
+ aFilterName = pSfxFilter->GetFilterName();
+
+ // #101808# since loading a graphic can cause a reschedule of the office
+ // it is possible that our shape is removed while where in this
+ // method.
+ if( pObj )
+ ((SdrGrafObj*)pObj)->SetGraphicLink( aURL, aFilterName );
+ }
+ else
+ {
+ }
+
+ }
+ else if( pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_GRAFSTREAMURL)))
+ {
+ OUString aStreamURL;
+
+ if( !( aValue >>= aStreamURL ) )
+ throw lang::IllegalArgumentException();
+
+
+ if( aStreamURL.compareToAscii( UNO_NAME_GRAPHOBJ_URLPKGPREFIX, RTL_CONSTASCII_LENGTH( UNO_NAME_GRAPHOBJ_URLPKGPREFIX ) ) != 0 )
+ {
+ aStreamURL = OUString();
+ }
+
+ ((SdrGrafObj*)pObj)->SetGrafStreamURL( aStreamURL );
+ ((SdrGrafObj*)pObj)->ForceSwapOut();
+ }
+ else
+ {
+ SvxShape::setPropertyValue(aPropertyName, aValue);
+ }
+ if( pModel )
+ pModel->SetChanged();
+}
+
+//----------------------------------------------------------------------
+uno::Any SAL_CALL SvxGraphicObject::getPropertyValue( const OUString& aPropertyName )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ ::SolarMutexGuard aGuard;
+
+ if(pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_FILLBITMAP)))
+ {
+ const Graphic& rGraphic = ((SdrGrafObj*)pObj)->GetGraphic();
+
+ if(rGraphic.GetType() != GRAPHIC_GDIMETAFILE)
+ {
+ // Objekt in eine Bitmap packen
+ Reference< ::com::sun::star::awt::XBitmap > xBitmap( VCLUnoHelper::CreateBitmap(((SdrGrafObj*)pObj)->GetGraphic().GetBitmapEx()) );
+ return uno::Any( &xBitmap, ::getCppuType((const Reference<awt::XBitmap>*)0) );
+ }
+ else
+ {
+ SvMemoryStream aDestStrm( 65535, 65535 );
+
+ ConvertGDIMetaFileToWMF( rGraphic.GetGDIMetaFile(), aDestStrm, NULL, sal_False );
+ const uno::Sequence<sal_Int8> aSeq(
+ static_cast< const sal_Int8* >(aDestStrm.GetData()),
+ aDestStrm.GetEndOfData());
+ return uno::Any( &aSeq, ::getCppuType(( uno::Sequence< sal_Int8 >*)0) );
+ }
+ }
+ else if( pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_GRAFURL)) )
+ {
+ uno::Any aAny;
+ if( ((SdrGrafObj*)pObj)->IsLinkedGraphic() )
+ {
+ aAny <<= OUString( ((SdrGrafObj*)pObj)->GetFileName() );
+ }
+ else
+ {
+ const BfGraphicObject& rGrafObj = ((SdrGrafObj*)pObj)->GetGraphicObject();
+ OUString aURL( RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX));
+ aURL += OUString::createFromAscii( rGrafObj.GetUniqueID().GetBuffer() );
+ aAny <<= aURL;
+ }
+ return aAny;
+ }
+ else if( pObj && aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_GRAFSTREAMURL)) )
+ {
+ const OUString aStreamURL( ( (SdrGrafObj*) pObj )->GetGrafStreamURL() );
+ uno::Any aAny;
+
+ if( aStreamURL.getLength() )
+ aAny <<= aStreamURL;
+
+ return aAny;
+ }
+ else
+ {
+ return SvxShape::getPropertyValue(aPropertyName);
+ }
+}
+
+// ::com::sun::star::lang::XServiceInfo
+uno::Sequence< OUString > SAL_CALL SvxGraphicObject::getSupportedServiceNames()
+ throw( uno::RuntimeException )
+{
+ return SvxShapeText::getSupportedServiceNames();
+}
+
+
+void SvxConvertPolyPolygonBezierToXPolygon( const drawing::PolyPolygonBezierCoords* pSourcePolyPolygon, XPolygon& rNewPolygon )
+ throw( lang::IllegalArgumentException )
+{
+ sal_Int32 nOuterSequenceCount = pSourcePolyPolygon->Coordinates.getLength();
+ if( nOuterSequenceCount != 1 || pSourcePolyPolygon->Flags.getLength() != nOuterSequenceCount)
+ throw lang::IllegalArgumentException();
+
+ // Zeiger auf innere sequences holen
+ const drawing::PointSequence* pInnerSequence = pSourcePolyPolygon->Coordinates.getConstArray();
+ const drawing::FlagSequence* pInnerSequenceFlags = pSourcePolyPolygon->Flags.getConstArray();
+
+ sal_Int32 nInnerSequenceCount = pInnerSequence->getLength();
+
+ if(pInnerSequenceFlags->getLength() != nInnerSequenceCount)
+ throw lang::IllegalArgumentException();
+
+ // Zeiger auf Arrays holen
+ const awt::Point* pArray = pInnerSequence->getConstArray();
+ const drawing::PolygonFlags* pArrayFlags = pInnerSequenceFlags->getConstArray();
+
+ for(sal_Int32 b=0;b<nInnerSequenceCount;b++)
+ {
+ rNewPolygon[(USHORT)b] = Point( pArray->X, pArray->Y );
+ pArray++;
+ rNewPolygon.SetFlags((USHORT)b, (XPolyFlags)((sal_uInt16)*pArrayFlags++));
+ }
+}
+
+void SvxConvertXPolygonToPolyPolygonBezier( const XPolygon& rPolygon, drawing::PolyPolygonBezierCoords& rRetval ) throw()
+{
+ // Polygone innerhalb vrobereiten
+ rRetval.Coordinates.realloc(1);
+ rRetval.Flags.realloc(1);
+
+ // Zeiger auf aeussere Arrays holen
+ drawing::PointSequence* pOuterSequence = rRetval.Coordinates.getArray();
+ drawing::FlagSequence* pOuterFlags = rRetval.Flags.getArray();
+
+ // Platz in Arrays schaffen
+ pOuterSequence->realloc((sal_Int32)rPolygon.GetPointCount());
+ pOuterFlags->realloc((sal_Int32)rPolygon.GetPointCount());
+
+ // Pointer auf arrays holen
+ awt::Point* pInnerSequence = pOuterSequence->getArray();
+ drawing::PolygonFlags* pInnerFlags = pOuterFlags->getArray();
+
+ for(sal_uInt16 b=0;b<rPolygon.GetPointCount();b++)
+ {
+ *pInnerSequence++ = awt::Point( rPolygon[b].X(), rPolygon[b].Y() );
+ *pInnerFlags++ = (drawing::PolygonFlags)((sal_uInt16)rPolygon.GetFlags(b));
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+SvxShapeCaption::SvxShapeCaption( SdrObject* pSdrObj ) throw()
+: SvxShapeText( pSdrObj, aSvxMapProvider.GetMap(SVXMAP_CAPTION) )
+{
+}
+
+SvxShapeCaption::~SvxShapeCaption() throw()
+{
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */