summaryrefslogtreecommitdiff
path: root/xmloff/source/text/XMLTextFrameContext.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/text/XMLTextFrameContext.cxx')
-rw-r--r--xmloff/source/text/XMLTextFrameContext.cxx1681
1 files changed, 1681 insertions, 0 deletions
diff --git a/xmloff/source/text/XMLTextFrameContext.cxx b/xmloff/source/text/XMLTextFrameContext.cxx
new file mode 100644
index 000000000000..accaa49d5ea4
--- /dev/null
+++ b/xmloff/source/text/XMLTextFrameContext.cxx
@@ -0,0 +1,1681 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_xmloff.hxx"
+#include <tools/debug.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/text/TextContentAnchorType.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/text/XTextFrame.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/text/SizeType.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
+#include <com/sun/star/document/XEventsSupplier.hpp>
+#include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/text/HoriOrientation.hpp>
+#include <com/sun/star/text/VertOrientation.hpp>
+#include <xmloff/xmlimp.hxx>
+#include <xmloff/xmltoken.hxx>
+#include "xmlnmspe.hxx"
+#include <xmloff/nmspmap.hxx>
+#include <xmloff/xmluconv.hxx>
+#include "XMLAnchorTypePropHdl.hxx"
+#include "XMLEmbeddedObjectImportContext.hxx"
+#include <xmloff/XMLBase64ImportContext.hxx>
+#include "XMLReplacementImageContext.hxx"
+#include <xmloff/prstylei.hxx>
+#include "i18nmap.hxx"
+#include "xexptran.hxx"
+#include <xmloff/shapeimport.hxx>
+#include <xmloff/XMLEventsImportContext.hxx>
+#include "XMLImageMapContext.hxx"
+#include "XMLTextFrameContext.hxx"
+
+#include "XMLTextListBlockContext.hxx"
+#include "XMLTextListItemContext.hxx"
+#include <xmloff/attrlist.hxx>
+#include <comphelper/stl_types.hxx>
+
+#include <map>
+
+
+using ::rtl::OUString;
+using ::rtl::OUStringBuffer;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::xml::sax;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::drawing;
+using namespace ::com::sun::star::document;
+using namespace ::xmloff::token;
+using ::com::sun::star::document::XEventsSupplier;
+
+#define XML_TEXT_FRAME_TEXTBOX 1
+#define XML_TEXT_FRAME_GRAPHIC 2
+#define XML_TEXT_FRAME_OBJECT 3
+#define XML_TEXT_FRAME_OBJECT_OLE 4
+#define XML_TEXT_FRAME_APPLET 5
+#define XML_TEXT_FRAME_PLUGIN 6
+#define XML_TEXT_FRAME_FLOATING_FRAME 7
+
+typedef ::std::map < const ::rtl::OUString, ::rtl::OUString, ::comphelper::UStringLess> ParamMap;
+
+class XMLTextFrameContextHyperlink_Impl
+{
+ OUString sHRef;
+ OUString sName;
+ OUString sTargetFrameName;
+ sal_Bool bMap;
+
+public:
+
+ inline XMLTextFrameContextHyperlink_Impl( const OUString& rHRef,
+ const OUString& rName,
+ const OUString& rTargetFrameName,
+ sal_Bool bMap );
+
+ const OUString& GetHRef() const { return sHRef; }
+ const OUString& GetName() const { return sName; }
+ const OUString& GetTargetFrameName() const { return sTargetFrameName; }
+ sal_Bool GetMap() const { return bMap; }
+};
+
+inline XMLTextFrameContextHyperlink_Impl::XMLTextFrameContextHyperlink_Impl(
+ const OUString& rHRef, const OUString& rName,
+ const OUString& rTargetFrameName, sal_Bool bM ) :
+ sHRef( rHRef ),
+ sName( rName ),
+ sTargetFrameName( rTargetFrameName ),
+ bMap( bM )
+{
+}
+
+// --> OD 2009-07-22 #i73249#
+class XMLTextFrameTitleOrDescContext_Impl : public SvXMLImportContext
+{
+ OUString& mrTitleOrDesc;
+
+public:
+
+ TYPEINFO();
+
+ XMLTextFrameTitleOrDescContext_Impl( SvXMLImport& rImport,
+ sal_uInt16 nPrfx,
+ const ::rtl::OUString& rLName,
+ OUString& rTitleOrDesc );
+ virtual ~XMLTextFrameTitleOrDescContext_Impl();
+
+ virtual void Characters( const OUString& rText );
+};
+
+TYPEINIT1( XMLTextFrameTitleOrDescContext_Impl, SvXMLImportContext );
+
+XMLTextFrameTitleOrDescContext_Impl::XMLTextFrameTitleOrDescContext_Impl(
+ SvXMLImport& rImport,
+ sal_uInt16 nPrfx,
+ const OUString& rLName,
+ OUString& rTitleOrDesc )
+ : SvXMLImportContext( rImport, nPrfx, rLName )
+ , mrTitleOrDesc( rTitleOrDesc )
+{
+}
+
+XMLTextFrameTitleOrDescContext_Impl::~XMLTextFrameTitleOrDescContext_Impl()
+{
+}
+
+void XMLTextFrameTitleOrDescContext_Impl::Characters( const OUString& rText )
+{
+ mrTitleOrDesc += rText;
+}
+// <--
+
+// ------------------------------------------------------------------------
+
+class XMLTextFrameParam_Impl : public SvXMLImportContext
+{
+public:
+
+ TYPEINFO();
+
+ XMLTextFrameParam_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const ::rtl::OUString& rLName,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
+ sal_uInt16 nType,
+ ParamMap &rParamMap);
+ virtual ~XMLTextFrameParam_Impl();
+};
+
+TYPEINIT1( XMLTextFrameParam_Impl, SvXMLImportContext );
+
+XMLTextFrameParam_Impl::~XMLTextFrameParam_Impl()
+{
+}
+
+XMLTextFrameParam_Impl::XMLTextFrameParam_Impl(
+ SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const ::rtl::OUString& rLName,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
+ sal_uInt16 /*nType*/,
+ ParamMap &rParamMap):
+ SvXMLImportContext( rImport, nPrfx, rLName )
+{
+ OUString sName, sValue;
+ sal_Bool bFoundValue = sal_False; // to allow empty values
+ sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; i++ )
+ {
+ const OUString& rAttrName = xAttrList->getNameByIndex( i );
+ const OUString& rValue = xAttrList->getValueByIndex( i );
+
+ OUString aLocalName;
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
+ if ( XML_NAMESPACE_DRAW == nPrefix )
+ {
+ if( IsXMLToken(aLocalName, XML_VALUE) )
+ {
+ sValue = rValue;
+ bFoundValue=sal_True;
+ }
+ else if( IsXMLToken(aLocalName, XML_NAME) )
+ {
+ sName = rValue;
+ }
+ }
+ }
+ if (sName.getLength() && bFoundValue )
+ rParamMap[sName] = sValue;
+}
+class XMLTextFrameContourContext_Impl : public SvXMLImportContext
+{
+ Reference < XPropertySet > xPropSet;
+
+public:
+
+ TYPEINFO();
+
+ XMLTextFrameContourContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const ::rtl::OUString& rLName,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
+ const Reference < XPropertySet >& rPropSet,
+ sal_Bool bPath );
+ virtual ~XMLTextFrameContourContext_Impl();
+};
+
+TYPEINIT1( XMLTextFrameContourContext_Impl, SvXMLImportContext );
+
+XMLTextFrameContourContext_Impl::XMLTextFrameContourContext_Impl(
+ SvXMLImport& rImport,
+ sal_uInt16 nPrfx, const OUString& rLName,
+ const Reference< XAttributeList > & xAttrList,
+ const Reference < XPropertySet >& rPropSet,
+ sal_Bool bPath ) :
+ SvXMLImportContext( rImport, nPrfx, rLName ),
+ xPropSet( rPropSet )
+{
+ OUString sD, sPoints, sViewBox;
+ sal_Bool bPixelWidth = sal_False, bPixelHeight = sal_False;
+ sal_Bool bAuto = sal_False;
+ sal_Int32 nWidth = 0;
+ sal_Int32 nHeight = 0;
+
+ const SvXMLTokenMap& rTokenMap =
+ GetImport().GetTextImport()->GetTextContourAttrTokenMap();
+
+ sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; i++ )
+ {
+ const OUString& rAttrName = xAttrList->getNameByIndex( i );
+ const OUString& rValue = xAttrList->getValueByIndex( i );
+
+ OUString aLocalName;
+ sal_uInt16 nPrefix =
+ GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
+ &aLocalName );
+ switch( rTokenMap.Get( nPrefix, aLocalName ) )
+ {
+ case XML_TOK_TEXT_CONTOUR_VIEWBOX:
+ sViewBox = rValue;
+ break;
+ case XML_TOK_TEXT_CONTOUR_D:
+ if( bPath )
+ sD = rValue;
+ break;
+ case XML_TOK_TEXT_CONTOUR_POINTS:
+ if( !bPath )
+ sPoints = rValue;
+ break;
+ case XML_TOK_TEXT_CONTOUR_WIDTH:
+ if( GetImport().GetMM100UnitConverter().convertMeasurePx( nWidth,
+ rValue) )
+ bPixelWidth = sal_True;
+ else
+ GetImport().GetMM100UnitConverter().convertMeasure( nWidth,
+ rValue);
+ break;
+ case XML_TOK_TEXT_CONTOUR_HEIGHT:
+ if( GetImport().GetMM100UnitConverter().convertMeasurePx( nHeight,
+ rValue) )
+ bPixelHeight = sal_True;
+ else
+ GetImport().GetMM100UnitConverter().convertMeasure( nHeight,
+ rValue);
+ break;
+ case XML_TOK_TEXT_CONTOUR_AUTO:
+ bAuto = IsXMLToken(rValue, XML_TRUE);
+ break;
+ }
+ }
+
+ OUString sContourPolyPolygon(
+ RTL_CONSTASCII_USTRINGPARAM("ContourPolyPolygon") );
+ Reference < XPropertySetInfo > xPropSetInfo =
+ rPropSet->getPropertySetInfo();
+ if( xPropSetInfo->hasPropertyByName(
+ sContourPolyPolygon ) &&
+ nWidth > 0 && nHeight > 0 && bPixelWidth == bPixelHeight &&
+ (bPath ? sD : sPoints).getLength() )
+ {
+ awt::Point aPoint( 0, 0 );
+ awt::Size aSize( nWidth, nHeight );
+ SdXMLImExViewBox aViewBox( sViewBox,
+ GetImport().GetMM100UnitConverter());
+ Any aAny;
+ if( bPath )
+ {
+ SdXMLImExSvgDElement aPoints( sD, aViewBox, aPoint, aSize,
+ GetImport().GetMM100UnitConverter() );
+ aAny <<= aPoints.GetPointSequenceSequence();
+ }
+ else
+ {
+ SdXMLImExPointsElement aPoints( sPoints, aViewBox, aPoint, aSize,
+ GetImport().GetMM100UnitConverter() );
+ aAny <<= aPoints.GetPointSequenceSequence();
+ }
+
+ OUString sIsPixelContour(
+ RTL_CONSTASCII_USTRINGPARAM("IsPixelContour") );
+ xPropSet->setPropertyValue( sContourPolyPolygon, aAny );
+
+ if( xPropSetInfo->hasPropertyByName( sIsPixelContour ) )
+ {
+ aAny.setValue( &bPixelWidth, ::getBooleanCppuType() );
+ xPropSet->setPropertyValue( sIsPixelContour, aAny );
+ }
+
+ OUString sIsAutomaticContour(
+ RTL_CONSTASCII_USTRINGPARAM("IsAutomaticContour") );
+ if( xPropSetInfo->hasPropertyByName( sIsAutomaticContour ) )
+ {
+ aAny.setValue( &bAuto, ::getBooleanCppuType() );
+ xPropSet->setPropertyValue( sIsAutomaticContour, aAny );
+ }
+ }
+}
+
+XMLTextFrameContourContext_Impl::~XMLTextFrameContourContext_Impl()
+{
+}
+
+// ------------------------------------------------------------------------
+
+class XMLTextFrameContext_Impl : public SvXMLImportContext
+{
+ ::com::sun::star::uno::Reference <
+ ::com::sun::star::text::XTextCursor > xOldTextCursor;
+ ::com::sun::star::uno::Reference <
+ ::com::sun::star::beans::XPropertySet > xPropSet;
+ ::com::sun::star::uno::Reference <
+ ::com::sun::star::io::XOutputStream > xBase64Stream;
+
+ /// old list item and block (#89891#)
+ bool mbListContextPushed;
+
+ const ::rtl::OUString sWidth;
+ const ::rtl::OUString sWidthType;
+ const ::rtl::OUString sRelativeWidth;
+ const ::rtl::OUString sHeight;
+ const ::rtl::OUString sRelativeHeight;
+ const ::rtl::OUString sSizeType;
+ const ::rtl::OUString sIsSyncWidthToHeight;
+ const ::rtl::OUString sIsSyncHeightToWidth;
+ const ::rtl::OUString sHoriOrient;
+ const ::rtl::OUString sHoriOrientPosition;
+ const ::rtl::OUString sVertOrient;
+ const ::rtl::OUString sVertOrientPosition;
+ const ::rtl::OUString sChainNextName;
+ const ::rtl::OUString sAnchorType;
+ const ::rtl::OUString sAnchorPageNo;
+ const ::rtl::OUString sGraphicURL;
+ const ::rtl::OUString sGraphicFilter;
+ // --> OD 2009-07-22 #i73249#
+// const ::rtl::OUString sAlternativeText;
+ const ::rtl::OUString sTitle;
+ const ::rtl::OUString sDescription;
+ // <--
+ const ::rtl::OUString sFrameStyleName;
+ const ::rtl::OUString sGraphicRotation;
+ const ::rtl::OUString sTextBoxServiceName;
+ const ::rtl::OUString sGraphicServiceName;
+
+ ::rtl::OUString sName;
+ ::rtl::OUString sStyleName;
+ ::rtl::OUString sNextName;
+ ::rtl::OUString sHRef;
+ ::rtl::OUString sFilterName;
+ ::rtl::OUString sCode;
+ ::rtl::OUString sObject;
+ ::rtl::OUString sArchive;
+ ::rtl::OUString sMimeType;
+ ::rtl::OUString sFrameName;
+ ::rtl::OUString sAppletName;
+ ::rtl::OUString sFilterService;
+ ::rtl::OUString sBase64CharsLeft;
+ ::rtl::OUString sTblName;
+
+ ParamMap aParamMap;
+
+ sal_Int32 nX;
+ sal_Int32 nY;
+ sal_Int32 nWidth;
+ sal_Int32 nHeight;
+ sal_Int32 nZIndex;
+ sal_Int16 nPage;
+ sal_Int16 nRotation;
+ sal_Int16 nRelWidth;
+ sal_Int16 nRelHeight;
+
+ sal_uInt16 nType;
+ ::com::sun::star::text::TextContentAnchorType eAnchorType;
+
+ sal_Bool bMayScript : 1;
+ sal_Bool bMinWidth : 1;
+ sal_Bool bMinHeight : 1;
+ sal_Bool bSyncWidth : 1;
+ sal_Bool bSyncHeight : 1;
+ sal_Bool bCreateFailed : 1;
+ sal_Bool bOwnBase64Stream : 1;
+
+ void Create( sal_Bool bHRefOrBase64 );
+
+public:
+
+ TYPEINFO();
+
+ sal_Bool CreateIfNotThere();
+
+ XMLTextFrameContext_Impl( SvXMLImport& rImport,
+ sal_uInt16 nPrfx,
+ const ::rtl::OUString& rLName,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & rAttrList,
+ ::com::sun::star::text::TextContentAnchorType eAnchorType,
+ sal_uInt16 nType,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & rFrameAttrList );
+ virtual ~XMLTextFrameContext_Impl();
+
+ virtual void EndElement();
+
+ virtual void Characters( const ::rtl::OUString& rChars );
+
+ SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
+ const ::rtl::OUString& rLocalName,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & xAttrList );
+
+ void SetHyperlink( const ::rtl::OUString& rHRef,
+ const ::rtl::OUString& rName,
+ const ::rtl::OUString& rTargetFrameName,
+ sal_Bool bMap );
+ // --> OD 2009-07-22 #i73249#
+ void SetTitle( const ::rtl::OUString& rTitle );
+ // <--
+ void SetDesc( const ::rtl::OUString& rDesc );
+
+ ::com::sun::star::text::TextContentAnchorType GetAnchorType() const { return eAnchorType; }
+
+ const ::com::sun::star::uno::Reference <
+ ::com::sun::star::beans::XPropertySet >& GetPropSet() { return xPropSet; }
+};
+
+TYPEINIT1( XMLTextFrameContext_Impl, SvXMLImportContext );
+
+void XMLTextFrameContext_Impl::Create( sal_Bool /*bHRefOrBase64*/ )
+{
+ UniReference < XMLTextImportHelper > xTextImportHelper =
+ GetImport().GetTextImport();
+
+ switch ( nType)
+ {
+ case XML_TEXT_FRAME_OBJECT:
+ case XML_TEXT_FRAME_OBJECT_OLE:
+ if( xBase64Stream.is() )
+ {
+ OUString sURL( GetImport().ResolveEmbeddedObjectURLFromBase64() );
+ if( sURL.getLength() )
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertOLEObject( GetImport(), sURL,
+ sStyleName,
+ sTblName,
+ nWidth, nHeight );
+ }
+ else if( sHRef.getLength() )
+ {
+ OUString sURL( GetImport().ResolveEmbeddedObjectURL( sHRef,
+ OUString() ) );
+
+ if( GetImport().IsPackageURL( sHRef ) )
+ {
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertOLEObject( GetImport(), sURL,
+ sStyleName,
+ sTblName,
+ nWidth, nHeight );
+ }
+ else
+ {
+ // it should be an own OOo link that has no storage persistance
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertOOoLink( GetImport(),
+ sURL,
+ sStyleName,
+ sTblName,
+ nWidth, nHeight );
+ }
+ }
+ else
+ {
+ OUString sURL( RTL_CONSTASCII_USTRINGPARAM("vnd.sun.star.ServiceName:") );
+ sURL += sFilterService;
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertOLEObject( GetImport(), sURL,
+ sStyleName,
+ sTblName,
+ nWidth, nHeight );
+
+ }
+ break;
+ case XML_TEXT_FRAME_APPLET:
+ {
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertApplet( sAppletName, sCode,
+ bMayScript, sHRef,
+ nWidth, nHeight);
+ break;
+ }
+ case XML_TEXT_FRAME_PLUGIN:
+ {
+ if(sHRef.getLength())
+ GetImport().GetAbsoluteReference(sHRef);
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertPlugin( sMimeType, sHRef,
+ nWidth, nHeight);
+
+ break;
+ }
+ case XML_TEXT_FRAME_FLOATING_FRAME:
+ {
+ xPropSet = GetImport().GetTextImport()
+ ->createAndInsertFloatingFrame( sFrameName, sHRef,
+ sStyleName,
+ nWidth, nHeight);
+ break;
+ }
+ default:
+ {
+ Reference<XMultiServiceFactory> xFactory( GetImport().GetModel(),
+ UNO_QUERY );
+ if( xFactory.is() )
+ {
+ OUString sServiceName;
+ switch( nType )
+ {
+ case XML_TEXT_FRAME_TEXTBOX: sServiceName = sTextBoxServiceName; break;
+ case XML_TEXT_FRAME_GRAPHIC: sServiceName = sGraphicServiceName; break;
+ }
+ Reference<XInterface> xIfc = xFactory->createInstance( sServiceName );
+ DBG_ASSERT( xIfc.is(), "couldn't create frame" );
+ if( xIfc.is() )
+ xPropSet = Reference < XPropertySet >( xIfc, UNO_QUERY );
+ }
+ }
+ }
+
+ if( !xPropSet.is() )
+ {
+ bCreateFailed = sal_True;
+ return;
+ }
+
+ Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
+
+ // set name
+ Reference < XNamed > xNamed( xPropSet, UNO_QUERY );
+ if( xNamed.is() )
+ {
+ OUString sOrigName( xNamed->getName() );
+ if( !sOrigName.getLength() ||
+ (sName.getLength() && sOrigName != sName) )
+ {
+ OUString sOldName( sName );
+ sal_Int32 i = 0;
+ while( xTextImportHelper->HasFrameByName( sName ) )
+ {
+ sName = sOldName;
+ sName += OUString::valueOf( ++i );
+ }
+ xNamed->setName( sName );
+ if( sName != sOldName )
+ xTextImportHelper->GetRenameMap().Add( XML_TEXT_RENAME_TYPE_FRAME,
+ sOldName, sName );
+ }
+ }
+
+ // frame style
+ XMLPropStyleContext *pStyle = 0;
+ if( sStyleName.getLength() )
+ {
+ pStyle = xTextImportHelper->FindAutoFrameStyle( sStyleName );
+ if( pStyle )
+ sStyleName = pStyle->GetParentName();
+ }
+
+ Any aAny;
+ if( sStyleName.getLength() )
+ {
+ OUString sDisplayStyleName( GetImport().GetStyleDisplayName(
+ XML_STYLE_FAMILY_SD_GRAPHICS_ID, sStyleName ) );
+ const Reference < XNameContainer > & rStyles =
+ xTextImportHelper->GetFrameStyles();
+ if( rStyles.is() &&
+ rStyles->hasByName( sDisplayStyleName ) )
+ {
+ aAny <<= sDisplayStyleName;
+ xPropSet->setPropertyValue( sFrameStyleName, aAny );
+ }
+ }
+
+ // anchor type (must be set before any other properties, because
+ // otherwise some orientations cannot be set or will be changed
+ // afterwards)
+ aAny <<= eAnchorType;
+ xPropSet->setPropertyValue( sAnchorType, aAny );
+
+ // hard properties
+ if( pStyle )
+ pStyle->FillPropertySet( xPropSet );
+
+
+ // x and y
+ sal_Int16 nHoriOrient = HoriOrientation::NONE;
+ aAny = xPropSet->getPropertyValue( sHoriOrient );
+ aAny >>= nHoriOrient;
+ if( HoriOrientation::NONE == nHoriOrient )
+ {
+ aAny <<= nX;
+ xPropSet->setPropertyValue( sHoriOrientPosition, aAny );
+ }
+
+ sal_Int16 nVertOrient = VertOrientation::NONE;
+ aAny = xPropSet->getPropertyValue( sVertOrient );
+ aAny >>= nVertOrient;
+ if( VertOrientation::NONE == nVertOrient )
+ {
+ aAny <<= nY;
+ xPropSet->setPropertyValue( sVertOrientPosition, aAny );
+ }
+
+ // width
+ if( nWidth > 0 )
+ {
+ aAny <<= nWidth;
+ xPropSet->setPropertyValue( sWidth, aAny );
+ }
+ if( nRelWidth > 0 || nWidth > 0 )
+ {
+ aAny <<= nRelWidth;
+ xPropSet->setPropertyValue( sRelativeWidth, aAny );
+ }
+ if( bSyncWidth || nWidth > 0 )
+ {
+ sal_Bool bTmp = bSyncWidth;
+ aAny.setValue( &bTmp, ::getBooleanCppuType() );
+ xPropSet->setPropertyValue( sIsSyncWidthToHeight, aAny );
+ }
+ if( xPropSetInfo->hasPropertyByName( sWidthType ) &&
+ (bMinWidth || nWidth > 0 || nRelWidth > 0 ) )
+ {
+ sal_Int16 nSizeType =
+ (bMinWidth && XML_TEXT_FRAME_TEXTBOX == nType) ? SizeType::MIN
+ : SizeType::FIX;
+ aAny <<= nSizeType;
+ xPropSet->setPropertyValue( sWidthType, aAny );
+ }
+
+ if( nHeight > 0 )
+ {
+ aAny <<= nHeight;
+ xPropSet->setPropertyValue( sHeight, aAny );
+ }
+ if( nRelHeight > 0 || nHeight > 0 )
+ {
+ aAny <<= nRelHeight;
+ xPropSet->setPropertyValue( sRelativeHeight, aAny );
+ }
+ if( bSyncHeight || nHeight > 0 )
+ {
+ sal_Bool bTmp = bSyncHeight;
+ aAny.setValue( &bTmp, ::getBooleanCppuType() );
+ xPropSet->setPropertyValue( sIsSyncHeightToWidth, aAny );
+ }
+ if( xPropSetInfo->hasPropertyByName( sSizeType ) &&
+ (bMinHeight || nHeight > 0 || nRelHeight > 0 ) )
+ {
+ sal_Int16 nSizeType =
+ (bMinHeight && XML_TEXT_FRAME_TEXTBOX == nType) ? SizeType::MIN
+ : SizeType::FIX;
+ aAny <<= nSizeType;
+ xPropSet->setPropertyValue( sSizeType, aAny );
+ }
+
+ if( XML_TEXT_FRAME_GRAPHIC == nType )
+ {
+ // URL
+ OSL_ENSURE( sHRef.getLength() > 0 || xBase64Stream.is(),
+ "neither URL nor base64 image data given" );
+ UniReference < XMLTextImportHelper > xTxtImport =
+ GetImport().GetTextImport();
+ if( sHRef.getLength() )
+ {
+ sal_Bool bForceLoad = xTxtImport->IsInsertMode() ||
+ xTxtImport->IsBlockMode() ||
+ xTxtImport->IsStylesOnlyMode() ||
+ xTxtImport->IsOrganizerMode();
+ sHRef = GetImport().ResolveGraphicObjectURL( sHRef, !bForceLoad );
+ }
+ else if( xBase64Stream.is() )
+ {
+ sHRef = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream );
+ xBase64Stream = 0;
+ }
+ aAny <<= sHRef;
+ xPropSet->setPropertyValue( sGraphicURL, aAny );
+
+ // filter name
+ aAny <<=sFilterName;
+ xPropSet->setPropertyValue( sGraphicFilter, aAny );
+
+ // rotation
+ aAny <<= nRotation;
+ xPropSet->setPropertyValue( sGraphicRotation, aAny );
+ }
+
+ // page number (must be set after the frame is inserted, because it
+ // will be overwritten then inserting the frame.
+ if( TextContentAnchorType_AT_PAGE == eAnchorType && nPage > 0 )
+ {
+ aAny <<= nPage;
+ xPropSet->setPropertyValue( sAnchorPageNo, aAny );
+ }
+
+ if( XML_TEXT_FRAME_OBJECT != nType &&
+ XML_TEXT_FRAME_OBJECT_OLE != nType &&
+ XML_TEXT_FRAME_APPLET != nType &&
+ XML_TEXT_FRAME_PLUGIN!= nType &&
+ XML_TEXT_FRAME_FLOATING_FRAME != nType)
+ {
+ Reference < XTextContent > xTxtCntnt( xPropSet, UNO_QUERY );
+ xTextImportHelper->InsertTextContent( xTxtCntnt );
+ }
+
+ Reference < XShape > xShape( xPropSet, UNO_QUERY );
+
+ // #107848#
+ // Make adding the shepe to Z-Ordering dependent from if we are
+ // inside a inside_deleted_section (redlining). That is necessary
+ // since the shape will be removed again later. It would lead to
+ // errors if it would stay inside the Z-Ordering. Thus, the
+ // easiest way to solve that conflict is to not add it here.
+ if(!GetImport().HasTextImport()
+ || !GetImport().GetTextImport()->IsInsideDeleteContext())
+ {
+ GetImport().GetShapeImport()->shapeWithZIndexAdded( xShape, nZIndex );
+ }
+
+ if( XML_TEXT_FRAME_TEXTBOX == nType )
+ {
+ xTextImportHelper->ConnectFrameChains( sName, sNextName, xPropSet );
+ Reference < XTextFrame > xTxtFrame( xPropSet, UNO_QUERY );
+ Reference < XText > xTxt = xTxtFrame->getText();
+ xOldTextCursor = xTextImportHelper->GetCursor();
+ xTextImportHelper->SetCursor( xTxt->createTextCursor() );
+
+ // remember old list item and block (#89892#) and reset them
+ // for the text frame
+ xTextImportHelper->PushListContext();
+ mbListContextPushed = true;
+ }
+}
+
+sal_Bool XMLTextFrameContext_Impl::CreateIfNotThere()
+{
+ if( !xPropSet.is() &&
+ ( XML_TEXT_FRAME_OBJECT_OLE == nType ||
+ XML_TEXT_FRAME_GRAPHIC == nType ) &&
+ xBase64Stream.is() && !bCreateFailed )
+ {
+ if( bOwnBase64Stream )
+ xBase64Stream->closeOutput();
+ Create( sal_True );
+ }
+
+ return xPropSet.is();
+}
+
+XMLTextFrameContext_Impl::XMLTextFrameContext_Impl(
+ SvXMLImport& rImport,
+ sal_uInt16 nPrfx, const OUString& rLName,
+ const Reference< XAttributeList > & rAttrList,
+ TextContentAnchorType eATyp,
+ sal_uInt16 nNewType,
+ const Reference< XAttributeList > & rFrameAttrList )
+: SvXMLImportContext( rImport, nPrfx, rLName )
+, mbListContextPushed( false )
+, sWidth(RTL_CONSTASCII_USTRINGPARAM("Width"))
+, sWidthType(RTL_CONSTASCII_USTRINGPARAM("WidthType"))
+, sRelativeWidth(RTL_CONSTASCII_USTRINGPARAM("RelativeWidth"))
+, sHeight(RTL_CONSTASCII_USTRINGPARAM("Height"))
+, sRelativeHeight(RTL_CONSTASCII_USTRINGPARAM("RelativeHeight"))
+, sSizeType(RTL_CONSTASCII_USTRINGPARAM("SizeType"))
+, sIsSyncWidthToHeight(RTL_CONSTASCII_USTRINGPARAM("IsSyncWidthToHeight"))
+, sIsSyncHeightToWidth(RTL_CONSTASCII_USTRINGPARAM("IsSyncHeightToWidth"))
+, sHoriOrient(RTL_CONSTASCII_USTRINGPARAM("HoriOrient"))
+, sHoriOrientPosition(RTL_CONSTASCII_USTRINGPARAM("HoriOrientPosition"))
+, sVertOrient(RTL_CONSTASCII_USTRINGPARAM("VertOrient"))
+, sVertOrientPosition(RTL_CONSTASCII_USTRINGPARAM("VertOrientPosition"))
+, sChainNextName(RTL_CONSTASCII_USTRINGPARAM("ChainNextName"))
+, sAnchorType(RTL_CONSTASCII_USTRINGPARAM("AnchorType"))
+, sAnchorPageNo(RTL_CONSTASCII_USTRINGPARAM("AnchorPageNo"))
+, sGraphicURL(RTL_CONSTASCII_USTRINGPARAM("GraphicURL"))
+, sGraphicFilter(RTL_CONSTASCII_USTRINGPARAM("GraphicFilter"))
+// --> OD 2009-07-22 #i73249#
+//, sAlternativeText(RTL_CONSTASCII_USTRINGPARAM("AlternativeText"))
+, sTitle(RTL_CONSTASCII_USTRINGPARAM("Title"))
+, sDescription(RTL_CONSTASCII_USTRINGPARAM("Description"))
+// <--
+, sFrameStyleName(RTL_CONSTASCII_USTRINGPARAM("FrameStyleName"))
+, sGraphicRotation(RTL_CONSTASCII_USTRINGPARAM("GraphicRotation"))
+, sTextBoxServiceName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFrame"))
+, sGraphicServiceName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.GraphicObject"))
+, nType( nNewType )
+, eAnchorType( eATyp )
+{
+ nX = 0;
+ nY = 0;
+ nWidth = 0;
+ nHeight = 0;
+ nZIndex = -1;
+ nPage = 0;
+ nRotation = 0;
+ nRelWidth = 0;
+ nRelHeight = 0;
+ bMayScript = sal_False;
+
+ bMinHeight = sal_False;
+ bMinWidth = sal_False;
+ bSyncWidth = sal_False;
+ bSyncHeight = sal_False;
+ bCreateFailed = sal_False;
+ bOwnBase64Stream = sal_False;
+
+ UniReference < XMLTextImportHelper > xTxtImport =
+ GetImport().GetTextImport();
+ const SvXMLTokenMap& rTokenMap =
+ xTxtImport->GetTextFrameAttrTokenMap();
+
+ sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
+ sal_Int16 nTotalAttrCount = nAttrCount + (rFrameAttrList.is() ? rFrameAttrList->getLength() : 0);
+ for( sal_Int16 i=0; i < nTotalAttrCount; i++ )
+ {
+ const OUString& rAttrName =
+ i < nAttrCount ? rAttrList->getNameByIndex( i ) : rFrameAttrList->getNameByIndex( i-nAttrCount );
+ const OUString& rValue =
+ i < nAttrCount ? rAttrList->getValueByIndex( i ): rFrameAttrList->getValueByIndex( i-nAttrCount );
+
+ OUString aLocalName;
+ sal_uInt16 nPrefix =
+ GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
+ &aLocalName );
+ switch( rTokenMap.Get( nPrefix, aLocalName ) )
+ {
+ case XML_TOK_TEXT_FRAME_STYLE_NAME:
+ sStyleName = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_NAME:
+ sName = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_FRAME_NAME:
+ sFrameName = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_APPLET_NAME:
+ sAppletName = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_ANCHOR_TYPE:
+ if( TextContentAnchorType_AT_PARAGRAPH == eAnchorType ||
+ TextContentAnchorType_AT_CHARACTER == eAnchorType ||
+ TextContentAnchorType_AS_CHARACTER == eAnchorType )
+ {
+
+ TextContentAnchorType eNew;
+ if( XMLAnchorTypePropHdl::convert( rValue, eNew ) &&
+ ( TextContentAnchorType_AT_PARAGRAPH == eNew ||
+ TextContentAnchorType_AT_CHARACTER == eNew ||
+ TextContentAnchorType_AS_CHARACTER == eNew ||
+ TextContentAnchorType_AT_PAGE == eNew) )
+ eAnchorType = eNew;
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_ANCHOR_PAGE_NUMBER:
+ {
+ sal_Int32 nTmp;
+ if( GetImport().GetMM100UnitConverter().
+ convertNumber( nTmp, rValue, 1, SHRT_MAX ) )
+ nPage = (sal_Int16)nTmp;
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_X:
+ GetImport().GetMM100UnitConverter().convertMeasure( nX, rValue );
+ break;
+ case XML_TOK_TEXT_FRAME_Y:
+ GetImport().GetMM100UnitConverter().convertMeasure( nY, rValue );
+ break;
+ case XML_TOK_TEXT_FRAME_WIDTH:
+ // relative widths are obsolete since SRC617. Remove them some day!
+ if( rValue.indexOf( '%' ) != -1 )
+ {
+ sal_Int32 nTmp;
+ GetImport().GetMM100UnitConverter().convertPercent( nTmp,
+ rValue );
+ nRelWidth = (sal_Int16)nTmp;
+ }
+ else
+ {
+ GetImport().GetMM100UnitConverter().convertMeasure( nWidth,
+ rValue, 0 );
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_REL_WIDTH:
+ if( IsXMLToken(rValue, XML_SCALE) )
+ {
+ bSyncWidth = sal_True;
+ }
+ else
+ {
+ sal_Int32 nTmp;
+ if( GetImport().GetMM100UnitConverter().
+ convertPercent( nTmp, rValue ) )
+ nRelWidth = (sal_Int16)nTmp;
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_MIN_WIDTH:
+ if( rValue.indexOf( '%' ) != -1 )
+ {
+ sal_Int32 nTmp;
+ GetImport().GetMM100UnitConverter().convertPercent( nTmp,
+ rValue );
+ nRelWidth = (sal_Int16)nTmp;
+ }
+ else
+ {
+ GetImport().GetMM100UnitConverter().convertMeasure( nWidth,
+ rValue, 0 );
+ }
+ bMinWidth = sal_True;
+ break;
+ case XML_TOK_TEXT_FRAME_HEIGHT:
+ // relative heights are obsolete since SRC617. Remove them some day!
+ if( rValue.indexOf( '%' ) != -1 )
+ {
+ sal_Int32 nTmp;
+ GetImport().GetMM100UnitConverter().convertPercent( nTmp,
+ rValue );
+ nRelHeight = (sal_Int16)nTmp;
+ }
+ else
+ {
+ GetImport().GetMM100UnitConverter().convertMeasure( nHeight,
+ rValue, 0 );
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_REL_HEIGHT:
+ if( IsXMLToken( rValue, XML_SCALE ) )
+ {
+ bSyncHeight = sal_True;
+ }
+ else if( IsXMLToken( rValue, XML_SCALE_MIN ) )
+ {
+ bSyncHeight = sal_True;
+ bMinHeight = sal_True;
+ }
+ else
+ {
+ sal_Int32 nTmp;
+ if( GetImport().GetMM100UnitConverter().
+ convertPercent( nTmp, rValue ) )
+ nRelHeight = (sal_Int16)nTmp;
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_MIN_HEIGHT:
+ if( rValue.indexOf( '%' ) != -1 )
+ {
+ sal_Int32 nTmp;
+ GetImport().GetMM100UnitConverter().convertPercent( nTmp,
+ rValue );
+ nRelHeight = (sal_Int16)nTmp;
+ }
+ else
+ {
+ GetImport().GetMM100UnitConverter().convertMeasure( nHeight,
+ rValue, 0 );
+ }
+ bMinHeight = sal_True;
+ break;
+ case XML_TOK_TEXT_FRAME_Z_INDEX:
+ GetImport().GetMM100UnitConverter().convertNumber( nZIndex, rValue, -1 );
+ break;
+ case XML_TOK_TEXT_FRAME_NEXT_CHAIN_NAME:
+ sNextName = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_HREF:
+ sHRef = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_FILTER_NAME:
+ sFilterName = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_TRANSFORM:
+ {
+ OUString sValue( rValue );
+ sValue.trim();
+ const OUString aRotate(GetXMLToken(XML_ROTATE));
+ const sal_Int32 nRotateLen(aRotate.getLength());
+ sal_Int32 nLen = sValue.getLength();
+ if( nLen >= nRotateLen+3 &&
+ 0 == sValue.compareTo( aRotate, nRotateLen ) &&
+ '(' == sValue[nRotateLen] &&
+ ')' == sValue[nLen-1] )
+ {
+ sValue = sValue.copy( nRotateLen+1, nLen-(nRotateLen+2) );
+ sValue.trim();
+ sal_Int32 nVal;
+ if( GetImport().GetMM100UnitConverter().convertNumber( nVal, sValue ) )
+ nRotation = (sal_Int16)(nVal % 360 );
+ }
+ }
+ break;
+ case XML_TOK_TEXT_FRAME_CODE:
+ sCode = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_OBJECT:
+ sObject = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_ARCHIVE:
+ sArchive = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_MAY_SCRIPT:
+ bMayScript = IsXMLToken( rValue, XML_TRUE );
+ break;
+ case XML_TOK_TEXT_FRAME_MIME_TYPE:
+ sMimeType = rValue;
+ break;
+ case XML_TOK_TEXT_FRAME_NOTIFY_ON_UPDATE:
+ sTblName = rValue;
+ break;
+ }
+ }
+
+ if( ( (XML_TEXT_FRAME_GRAPHIC == nType ||
+ XML_TEXT_FRAME_OBJECT == nType ||
+ XML_TEXT_FRAME_OBJECT_OLE == nType) &&
+ !sHRef.getLength() ) ||
+ ( XML_TEXT_FRAME_APPLET == nType && !sCode.getLength() ) ||
+ ( XML_TEXT_FRAME_PLUGIN == nType &&
+ sHRef.getLength() == 0 && sMimeType.getLength() == 0 ) )
+ return; // no URL: no image or OLE object
+
+ Create( sal_True );
+}
+
+XMLTextFrameContext_Impl::~XMLTextFrameContext_Impl()
+{
+}
+
+void XMLTextFrameContext_Impl::EndElement()
+{
+ CreateIfNotThere();
+
+ if( xOldTextCursor.is() )
+ {
+ GetImport().GetTextImport()->DeleteParagraph();
+ GetImport().GetTextImport()->SetCursor( xOldTextCursor );
+ }
+
+ // reinstall old list item (if necessary) #89892#
+ if (mbListContextPushed) {
+ GetImport().GetTextImport()->PopListContext();
+ }
+
+ if (( nType == XML_TEXT_FRAME_APPLET || nType == XML_TEXT_FRAME_PLUGIN ) && xPropSet.is())
+ GetImport().GetTextImport()->endAppletOrPlugin( xPropSet, aParamMap);
+}
+
+SvXMLImportContext *XMLTextFrameContext_Impl::CreateChildContext(
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference< XAttributeList > & xAttrList )
+{
+ SvXMLImportContext *pContext = 0;
+
+ if( XML_NAMESPACE_DRAW == nPrefix )
+ {
+ if ( (nType == XML_TEXT_FRAME_APPLET || nType == XML_TEXT_FRAME_PLUGIN) &&
+ IsXMLToken( rLocalName, XML_PARAM ) )
+ {
+ pContext = new XMLTextFrameParam_Impl( GetImport(),
+ nPrefix, rLocalName,
+ xAttrList, nType, aParamMap );
+ }
+ }
+ else if( (XML_NAMESPACE_OFFICE == nPrefix) )
+ {
+ if( IsXMLToken( rLocalName, XML_BINARY_DATA ) )
+ {
+ if( !xPropSet.is() && !xBase64Stream.is() && !bCreateFailed )
+ {
+ switch( nType )
+ {
+ case XML_TEXT_FRAME_GRAPHIC:
+ xBase64Stream =
+ GetImport().GetStreamForGraphicObjectURLFromBase64();
+ break;
+ case XML_TEXT_FRAME_OBJECT_OLE:
+ xBase64Stream =
+ GetImport().GetStreamForEmbeddedObjectURLFromBase64();
+ break;
+ }
+ if( xBase64Stream.is() )
+ pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
+ rLocalName, xAttrList,
+ xBase64Stream );
+ }
+ }
+ }
+ // --> OD 2009-08-17 #i100480#
+ // correction of condition which also avoids warnings.
+ if( !pContext &&
+ ( XML_TEXT_FRAME_OBJECT == nType &&
+ ( ( XML_NAMESPACE_OFFICE == nPrefix &&
+ IsXMLToken( rLocalName, XML_DOCUMENT ) ) ||
+ ( XML_NAMESPACE_MATH == nPrefix &&
+ IsXMLToken( rLocalName, XML_MATH ) ) ) ) )
+ // <--
+ {
+ if( !xPropSet.is() && !bCreateFailed )
+ {
+ XMLEmbeddedObjectImportContext *pEContext =
+ new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
+ rLocalName, xAttrList );
+ sFilterService = pEContext->GetFilterServiceName();
+ if( sFilterService.getLength() != 0 )
+ {
+ Create( sal_False );
+ if( xPropSet.is() )
+ {
+ Reference < XEmbeddedObjectSupplier > xEOS( xPropSet,
+ UNO_QUERY );
+ OSL_ENSURE( xEOS.is(),
+ "no embedded object supplier for own object" );
+ Reference<com::sun::star::lang::XComponent> aXComponent(xEOS->getEmbeddedObject());
+ pEContext->SetComponent( aXComponent );
+ }
+ }
+ pContext = pEContext;
+ }
+ }
+ if( !pContext && xOldTextCursor.is() ) // text-box
+ pContext = GetImport().GetTextImport()->CreateTextChildContext(
+ GetImport(), nPrefix, rLocalName, xAttrList,
+ XML_TEXT_TYPE_TEXTBOX );
+
+ if( !pContext )
+ pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
+
+ return pContext;
+}
+
+void XMLTextFrameContext_Impl::Characters( const OUString& rChars )
+{
+ if( ( XML_TEXT_FRAME_OBJECT_OLE == nType ||
+ XML_TEXT_FRAME_GRAPHIC == nType) &&
+ !xPropSet.is() && !bCreateFailed )
+ {
+ OUString sTrimmedChars( rChars. trim() );
+ if( sTrimmedChars.getLength() )
+ {
+ if( !xBase64Stream.is() )
+ {
+ if( XML_TEXT_FRAME_GRAPHIC == nType )
+ {
+ xBase64Stream =
+ GetImport().GetStreamForGraphicObjectURLFromBase64();
+ }
+ else
+ {
+ xBase64Stream =
+ GetImport().GetStreamForEmbeddedObjectURLFromBase64();
+ }
+ if( xBase64Stream.is() )
+ bOwnBase64Stream = sal_True;
+ }
+ if( bOwnBase64Stream && xBase64Stream.is() )
+ {
+ OUString sChars;
+ if( sBase64CharsLeft )
+ {
+ sChars = sBase64CharsLeft;
+ sChars += sTrimmedChars;
+ sBase64CharsLeft = OUString();
+ }
+ else
+ {
+ sChars = sTrimmedChars;
+ }
+ Sequence< sal_Int8 > aBuffer( (sChars.getLength() / 4) * 3 );
+ sal_Int32 nCharsDecoded =
+ GetImport().GetMM100UnitConverter().
+ decodeBase64SomeChars( aBuffer, sChars );
+ xBase64Stream->writeBytes( aBuffer );
+ if( nCharsDecoded != sChars.getLength() )
+ sBase64CharsLeft = sChars.copy( nCharsDecoded );
+ }
+ }
+ }
+}
+
+void XMLTextFrameContext_Impl::SetHyperlink( const OUString& rHRef,
+ const OUString& rName,
+ const OUString& rTargetFrameName,
+ sal_Bool bMap )
+{
+ static ::rtl::OUString s_HyperLinkURL(
+ RTL_CONSTASCII_USTRINGPARAM("HyperLinkURL"));
+ static ::rtl::OUString s_HyperLinkName(
+ RTL_CONSTASCII_USTRINGPARAM("HyperLinkName"));
+ static ::rtl::OUString s_HyperLinkTarget(
+ RTL_CONSTASCII_USTRINGPARAM("HyperLinkTarget"));
+ static ::rtl::OUString s_ServerMap(
+ RTL_CONSTASCII_USTRINGPARAM("ServerMap"));
+ if( !xPropSet.is() )
+ return;
+
+ UniReference< XMLTextImportHelper > xTxtImp = GetImport().GetTextImport();
+ Reference < XPropertySetInfo > xPropSetInfo =
+ xPropSet->getPropertySetInfo();
+ if( !xPropSetInfo.is() ||
+ !xPropSetInfo->hasPropertyByName(s_HyperLinkURL))
+ return;
+
+ Any aAny;
+ aAny <<= rHRef;
+ xPropSet->setPropertyValue( s_HyperLinkURL, aAny );
+
+ if (xPropSetInfo->hasPropertyByName(s_HyperLinkName))
+ {
+ aAny <<= rName;
+ xPropSet->setPropertyValue(s_HyperLinkName, aAny);
+ }
+
+ if (xPropSetInfo->hasPropertyByName(s_HyperLinkTarget))
+ {
+ aAny <<= rTargetFrameName;
+ xPropSet->setPropertyValue( s_HyperLinkTarget, aAny );
+ }
+
+ if (xPropSetInfo->hasPropertyByName(s_ServerMap))
+ {
+ aAny.setValue( &bMap, ::getBooleanCppuType() );
+ xPropSet->setPropertyValue(s_ServerMap, aAny);
+ }
+}
+
+// --> OD 2009-07-22 #i73249#
+void XMLTextFrameContext_Impl::SetTitle( const OUString& rTitle )
+{
+ if ( xPropSet.is() )
+ {
+ Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
+ if( xPropSetInfo->hasPropertyByName( sTitle ) )
+ {
+ xPropSet->setPropertyValue( sTitle, makeAny( rTitle ) );
+ }
+ }
+}
+
+void XMLTextFrameContext_Impl::SetDesc( const OUString& rDesc )
+{
+ if ( xPropSet.is() )
+ {
+ Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
+ if( xPropSetInfo->hasPropertyByName( sDescription ) )
+ {
+ xPropSet->setPropertyValue( sDescription, makeAny( rDesc ) );
+ }
+ }
+}
+// <--
+
+//-----------------------------------------------------------------------------------------------------
+
+TYPEINIT1( XMLTextFrameContext, SvXMLImportContext );
+
+sal_Bool XMLTextFrameContext::CreateIfNotThere()
+{
+ sal_Bool bRet = sal_False;
+ SvXMLImportContext *pContext = &m_xImplContext;
+ XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
+ if( pImpl )
+ bRet = pImpl->CreateIfNotThere();
+
+ return bRet;
+}
+
+sal_Bool XMLTextFrameContext::CreateIfNotThere( ::com::sun::star::uno::Reference <
+ ::com::sun::star::beans::XPropertySet >& rPropSet )
+{
+ SvXMLImportContext *pContext = &m_xImplContext;
+ XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
+ if( pImpl )
+ {
+ if( pImpl->CreateIfNotThere() )
+ rPropSet = pImpl->GetPropSet();
+ }
+
+ return rPropSet.is();
+}
+
+XMLTextFrameContext::XMLTextFrameContext(
+ SvXMLImport& rImport,
+ sal_uInt16 nPrfx, const OUString& rLName,
+ const Reference< XAttributeList > & xAttrList,
+ TextContentAnchorType eATyp )
+: SvXMLImportContext( rImport, nPrfx, rLName )
+, m_xAttrList( new SvXMLAttributeList( xAttrList ) )
+, m_pHyperlink( 0 )
+// --> OD 2009-07-22 #i73249#
+, m_sTitle()
+, m_sDesc()
+// <--
+, m_eDefaultAnchorType( eATyp )
+ // --> OD 2006-03-10 #i51726#
+, m_HasAutomaticStyleWithoutParentStyle( sal_False )
+ // <--
+, m_bSupportsReplacement( sal_False )
+{
+ sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; i++ )
+ {
+ const OUString& rAttrName = xAttrList->getNameByIndex( i );
+
+ OUString aLocalName;
+ sal_uInt16 nPrefix =
+ GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
+ // --> OD 2006-03-10 #i51726#
+ // New distinguish attribute between Writer objects and Draw objects is:
+ // Draw objects have an automatic style without a parent style
+ if ( XML_NAMESPACE_DRAW == nPrefix &&
+ IsXMLToken( aLocalName, XML_STYLE_NAME ) )
+ {
+ OUString aStyleName = xAttrList->getValueByIndex( i );
+ if( aStyleName.getLength() )
+ {
+ UniReference < XMLTextImportHelper > xTxtImport =
+ GetImport().GetTextImport();
+ XMLPropStyleContext* pStyle( 0L );
+ pStyle = xTxtImport->FindAutoFrameStyle( aStyleName );
+ if ( pStyle && !pStyle->GetParentName().getLength() )
+ {
+ m_HasAutomaticStyleWithoutParentStyle = sal_True;
+ }
+ }
+ }
+ // <--
+ else if ( XML_NAMESPACE_TEXT == nPrefix &&
+ IsXMLToken( aLocalName, XML_ANCHOR_TYPE ) )
+ {
+ TextContentAnchorType eNew;
+ if( XMLAnchorTypePropHdl::convert( xAttrList->getValueByIndex(i),
+ eNew ) &&
+ ( TextContentAnchorType_AT_PARAGRAPH == eNew ||
+ TextContentAnchorType_AT_CHARACTER == eNew ||
+ TextContentAnchorType_AS_CHARACTER == eNew ||
+ TextContentAnchorType_AT_PAGE == eNew) )
+ m_eDefaultAnchorType = eNew;
+ }
+ }
+}
+
+XMLTextFrameContext::~XMLTextFrameContext()
+{
+ delete m_pHyperlink;
+}
+
+void XMLTextFrameContext::EndElement()
+{
+ SvXMLImportContext *pContext = &m_xImplContext;
+ XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
+ if( pImpl )
+ {
+ pImpl->CreateIfNotThere();
+
+ // --> OD 2009-07-22 #i73249#
+// // alternative text
+// if( m_sDesc.getLength() )
+// pImpl->SetDesc( m_sDesc );
+ // svg:title
+ if( m_sTitle.getLength() )
+ {
+ pImpl->SetTitle( m_sTitle );
+ }
+ if( m_sDesc.getLength() )
+ {
+ pImpl->SetDesc( m_sDesc );
+ }
+ // <--
+
+ if( m_pHyperlink )
+ {
+ pImpl->SetHyperlink( m_pHyperlink->GetHRef(), m_pHyperlink->GetName(),
+ m_pHyperlink->GetTargetFrameName(), m_pHyperlink->GetMap() );
+ delete m_pHyperlink;
+ m_pHyperlink = 0;
+ }
+
+ }
+}
+
+SvXMLImportContext *XMLTextFrameContext::CreateChildContext(
+ sal_uInt16 p_nPrefix,
+ const OUString& rLocalName,
+ const Reference< XAttributeList > & xAttrList )
+{
+ SvXMLImportContext *pContext = 0;
+
+ if( !m_xImplContext.Is() )
+ {
+ // no child exists
+ if( XML_NAMESPACE_DRAW == p_nPrefix )
+ {
+ sal_uInt16 nFrameType = USHRT_MAX;
+ if( IsXMLToken( rLocalName, XML_TEXT_BOX ) )
+ nFrameType = XML_TEXT_FRAME_TEXTBOX;
+ else if( IsXMLToken( rLocalName, XML_IMAGE ) )
+ nFrameType = XML_TEXT_FRAME_GRAPHIC;
+ else if( IsXMLToken( rLocalName, XML_OBJECT ) )
+ nFrameType = XML_TEXT_FRAME_OBJECT;
+ else if( IsXMLToken( rLocalName, XML_OBJECT_OLE ) )
+ nFrameType = XML_TEXT_FRAME_OBJECT_OLE;
+ else if( IsXMLToken( rLocalName, XML_APPLET) )
+ nFrameType = XML_TEXT_FRAME_APPLET;
+ else if( IsXMLToken( rLocalName, XML_PLUGIN ) )
+ nFrameType = XML_TEXT_FRAME_PLUGIN;
+ else if( IsXMLToken( rLocalName, XML_FLOATING_FRAME ) )
+ nFrameType = XML_TEXT_FRAME_FLOATING_FRAME;
+
+ if( USHRT_MAX != nFrameType )
+ {
+ // --> OD 2006-03-10 #i51726#
+ if ( ( XML_TEXT_FRAME_TEXTBOX == nFrameType ||
+ XML_TEXT_FRAME_GRAPHIC == nFrameType ) &&
+ m_HasAutomaticStyleWithoutParentStyle )
+ // <--
+ {
+ Reference < XShapes > xShapes;
+ pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
+ GetImport(), p_nPrefix, rLocalName, xAttrList, xShapes, m_xAttrList );
+ }
+ else if( XML_TEXT_FRAME_PLUGIN == nFrameType )
+ {
+ bool bMedia = false;
+
+ // check, if we have a media object
+ for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
+ {
+ OUString aLocalName;
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
+
+ if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
+ {
+ if( 0 == xAttrList->getValueByIndex( n ).compareToAscii( "application/vnd.sun.star.media" ) )
+ bMedia = true;
+
+ // leave this loop
+ n = nAttrCount - 1;
+ }
+ }
+
+ if( bMedia )
+ {
+ Reference < XShapes > xShapes;
+ pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
+ GetImport(), p_nPrefix, rLocalName, xAttrList, xShapes, m_xAttrList );
+ }
+ }
+ else if( XML_TEXT_FRAME_OBJECT == nFrameType ||
+ XML_TEXT_FRAME_OBJECT_OLE == nFrameType )
+ {
+ m_bSupportsReplacement = sal_True;
+ }
+
+ if( !pContext )
+ {
+
+ pContext = new XMLTextFrameContext_Impl( GetImport(), p_nPrefix,
+ rLocalName, xAttrList,
+ m_eDefaultAnchorType,
+ nFrameType,
+ m_xAttrList );
+ }
+
+ m_xImplContext = pContext;
+ }
+ }
+ }
+ else if( m_bSupportsReplacement && !m_xReplImplContext &&
+ XML_NAMESPACE_DRAW == p_nPrefix &&
+ IsXMLToken( rLocalName, XML_IMAGE ) )
+ {
+ // read replacement image
+ Reference < XPropertySet > xPropSet;
+ if( CreateIfNotThere( xPropSet ) )
+ {
+ pContext = new XMLReplacementImageContext( GetImport(),
+ p_nPrefix, rLocalName, xAttrList, xPropSet );
+ m_xReplImplContext = pContext;
+ }
+ }
+ else if( m_xImplContext->ISA( XMLTextFrameContext_Impl ) )
+ {
+ // the child is a writer frame
+ if( XML_NAMESPACE_SVG == p_nPrefix )
+ {
+ // --> OD 2009-07-22 #i73249#
+// bool bOld = SvXMLImport::OOo_2x >= GetImport().getGeneratorVersion();
+// if( IsXMLToken( rLocalName, bOld ? XML_DESC : XML_TITLE ) )
+// pContext = new XMLTextFrameDescContext_Impl( GetImport(), p_nPrefix, rLocalName,
+// xAttrList, m_sDesc );
+ const bool bOld = SvXMLImport::OOo_2x >= GetImport().getGeneratorVersion();
+ if ( bOld )
+ {
+ if ( IsXMLToken( rLocalName, XML_DESC ) )
+ {
+ pContext = new XMLTextFrameTitleOrDescContext_Impl( GetImport(),
+ p_nPrefix,
+ rLocalName,
+ m_sTitle );
+ }
+ }
+ else
+ {
+ if( IsXMLToken( rLocalName, XML_TITLE ) )
+ {
+ pContext = new XMLTextFrameTitleOrDescContext_Impl( GetImport(),
+ p_nPrefix,
+ rLocalName,
+ m_sTitle );
+ }
+ else if ( IsXMLToken( rLocalName, XML_DESC ) )
+ {
+ pContext = new XMLTextFrameTitleOrDescContext_Impl( GetImport(),
+ p_nPrefix,
+ rLocalName,
+ m_sDesc );
+ }
+ }
+ // <--
+ }
+ else if( XML_NAMESPACE_DRAW == p_nPrefix )
+ {
+ Reference < XPropertySet > xPropSet;
+ if( IsXMLToken( rLocalName, XML_CONTOUR_POLYGON ) )
+ {
+ if( CreateIfNotThere( xPropSet ) )
+ pContext = new XMLTextFrameContourContext_Impl( GetImport(), p_nPrefix, rLocalName,
+ xAttrList, xPropSet, sal_False );
+ }
+ else if( IsXMLToken( rLocalName, XML_CONTOUR_PATH ) )
+ {
+ if( CreateIfNotThere( xPropSet ) )
+ pContext = new XMLTextFrameContourContext_Impl( GetImport(), p_nPrefix, rLocalName,
+ xAttrList, xPropSet, sal_True );
+ }
+ else if( IsXMLToken( rLocalName, XML_IMAGE_MAP ) )
+ {
+ if( CreateIfNotThere( xPropSet ) )
+ pContext = new XMLImageMapContext( GetImport(), p_nPrefix, rLocalName, xPropSet );
+ }
+ }
+ else if( (XML_NAMESPACE_OFFICE == p_nPrefix) && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) )
+ {
+ // do we still have the frame object?
+ Reference < XPropertySet > xPropSet;
+ if( CreateIfNotThere( xPropSet ) )
+ {
+ // is it an event supplier?
+ Reference<XEventsSupplier> xEventsSupplier(xPropSet, UNO_QUERY);
+ if (xEventsSupplier.is())
+ {
+ // OK, we have the events, so create the context
+ pContext = new XMLEventsImportContext(GetImport(), p_nPrefix,
+ rLocalName, xEventsSupplier);
+ }
+ }
+ }
+ }
+ else if( p_nPrefix == XML_NAMESPACE_SVG && // #i68101#
+ (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) )
+ {
+ pContext = m_xImplContext->CreateChildContext( p_nPrefix, rLocalName, xAttrList );
+ }
+ else
+ {
+ // the child is a drawing shape
+ pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
+ &m_xImplContext, p_nPrefix, rLocalName, xAttrList );
+ }
+
+ if( !pContext )
+ pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
+
+ return pContext;
+}
+
+void XMLTextFrameContext::SetHyperlink( const OUString& rHRef,
+ const OUString& rName,
+ const OUString& rTargetFrameName,
+ sal_Bool bMap )
+{
+ OSL_ENSURE( !m_pHyperlink, "recursive SetHyperlink call" );
+ delete m_pHyperlink;
+ m_pHyperlink = new XMLTextFrameContextHyperlink_Impl(
+ rHRef, rName, rTargetFrameName, bMap );
+}
+
+TextContentAnchorType XMLTextFrameContext::GetAnchorType() const
+{
+ SvXMLImportContext *pContext = &m_xImplContext;
+ XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
+ if( pImpl )
+ return pImpl->GetAnchorType();
+ else
+ return m_eDefaultAnchorType;
+}
+
+Reference < XTextContent > XMLTextFrameContext::GetTextContent() const
+{
+ Reference < XTextContent > xTxtCntnt;
+ SvXMLImportContext *pContext = &m_xImplContext;
+ XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
+ if( pImpl )
+ xTxtCntnt.set( pImpl->GetPropSet(), UNO_QUERY );
+
+ return xTxtCntnt;
+}
+
+// --> OD 2004-08-24 #33242#
+Reference < XShape > XMLTextFrameContext::GetShape() const
+{
+ Reference < XShape > xShape;
+ SvXMLImportContext* pContext = &m_xImplContext;
+ SvXMLShapeContext* pImpl = PTR_CAST( SvXMLShapeContext, pContext );
+ if ( pImpl )
+ {
+ xShape = pImpl->getShape();
+ }
+
+ return xShape;
+}
+// <--