/************************************************************************* * * $RCSfile: xmlimp.cxx,v $ * * $Revision: 1.86 $ * * last change: $Author: rt $ $Date: 2004-11-26 13:30:12 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #pragma hdrstop #ifndef _COM_SUN_STAR_TEXT_XTEXTDOCUMENT_HPP_ #include #endif #ifndef _COM_SUN_STAR_TEXT_XTEXTRANGE_HPP_ #include #endif #ifndef _COM_SUN_STAR_TEXT_XTEXT_HPP_ #include #endif #ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGE_HPP_ #include #endif #ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_ #include #endif #ifndef _COM_SUN_STAR_DRAWING_XSHAPES_HPP_ #include #endif #ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_ #include #endif #ifndef _XMLOFF_XMLNMSPE_HXX #include #endif #ifndef _XMLOFF_XMLTKMAP_HXX #include #endif #ifndef _XMLOFF_XMLICTXT_HXX #include #endif #ifndef _XMLOFF_TXTIMP_HXX #include #endif #ifndef _XMLOFF_NMSPMAP_HXX #include #endif #ifndef _XMLOFF_XMLTEXTSHAPEIMPORTHELPER_HXX_ #include #endif #ifndef _XMLOFF_XMLFONTSTYLESCONTEXT_HXX_ #include #endif #ifndef _XMLOFF_PROGRESSBARHELPER_HXX #include #endif #ifndef _COM_SUN_STAR_I18N_XFORBIDDENCHARACTERS_HPP_ #include #endif #ifndef _COM_SUN_STAR_DOCUMENT_PRINTERINDEPENDENTLAYOUT_HPP_ #include #endif #ifndef _DOC_HXX #include #endif #ifndef _UNOOBJ_HXX #include #endif #ifndef _UNOCRSR_HXX #include "unocrsr.hxx" #endif #ifndef _POOLFMT_HXX #include #endif #ifndef _NDTXT_HXX #include #endif #ifndef _PAM_HXX //autogen wg. SwPaM #include #endif #ifndef _EDITSH_HXX #include #endif #ifndef _XMLIMP_HXX #include "xmlimp.hxx" #endif #ifndef _XMLOFF_DOCUMENTSETTINGSCONTEXT_HXX #include #endif #ifndef _SWDOCSH_HXX #include #endif #ifndef _UNO_LINGU_HXX #include #endif #ifndef _XMLGRHLP_HXX #include #endif #ifndef _XMLEOHLP_HXX #include #endif #ifndef _SFX_PRINTER_HXX #include #endif #ifndef _FORBIDDEN_CHARACTERS_ENUM_HXX #include #endif #ifndef _XMLOFF_XMLUCONV_HXX #include #endif #ifndef INCLUDED_SVTOOLS_SAVEOPT_HXX #include #endif #include #include // for locking SolarMutex: svapp + mutex #ifndef _SV_SVAPP_HXX #include #endif #ifndef _VOS_MUTEX_HXX_ #include #endif #ifndef _XMLOFF_XFORMSIMPORT_HXX #include #endif #ifndef _UNOTXDOC_HXX #include // for initXForms() #endif using namespace ::rtl; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::text; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::container; using namespace ::com::sun::star::i18n; using namespace ::com::sun::star::drawing; using namespace ::xmloff::token; using namespace ::std; struct OUStringEquals { sal_Bool operator()( const rtl::OUString &r1, const rtl::OUString &r2) const { return r1 == r2; } }; //---------------------------------------------------------------------------- enum SwXMLDocTokens { XML_TOK_DOC_FONTDECLS, XML_TOK_DOC_STYLES, XML_TOK_DOC_AUTOSTYLES, XML_TOK_DOC_MASTERSTYLES, XML_TOK_DOC_META, XML_TOK_DOC_BODY, XML_TOK_DOC_SCRIPT, XML_TOK_DOC_SETTINGS, XML_TOK_DOC_XFORMS, XML_TOK_OFFICE_END=XML_TOK_UNKNOWN }; static __FAR_DATA SvXMLTokenMapEntry aDocTokenMap[] = { { XML_NAMESPACE_OFFICE, XML_FONT_FACE_DECLS, XML_TOK_DOC_FONTDECLS }, { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_DOC_STYLES }, { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES }, { XML_NAMESPACE_OFFICE, XML_MASTER_STYLES, XML_TOK_DOC_MASTERSTYLES }, { XML_NAMESPACE_OFFICE, XML_META, XML_TOK_DOC_META }, { XML_NAMESPACE_OFFICE, XML_BODY, XML_TOK_DOC_BODY }, { XML_NAMESPACE_OFFICE, XML_SCRIPTS, XML_TOK_DOC_SCRIPT }, { XML_NAMESPACE_OFFICE, XML_SETTINGS, XML_TOK_DOC_SETTINGS }, { XML_NAMESPACE_XFORMS, XML_MODEL, XML_TOK_DOC_XFORMS }, XML_TOKEN_MAP_END }; // ---------------------------------------------------------------------------- class SwXMLBodyContext_Impl : public SvXMLImportContext { const SwXMLImport& GetSwImport() const { return (const SwXMLImport&)GetImport(); } SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); } public: SwXMLBodyContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList ); virtual ~SwXMLBodyContext_Impl(); TYPEINFO(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ); }; SwXMLBodyContext_Impl::SwXMLBodyContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList ) : SvXMLImportContext( rImport, nPrfx, rLName ) { } SwXMLBodyContext_Impl::~SwXMLBodyContext_Impl() { } TYPEINIT1( SwXMLBodyContext_Impl, SvXMLImportContext ); SvXMLImportContext *SwXMLBodyContext_Impl::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) { return GetSwImport().CreateBodyContentContext( rLocalName ); } // ---------------------------------------------------------------------------- class SwXMLDocContext_Impl : public SvXMLImportContext { const SwXMLImport& GetSwImport() const { return (const SwXMLImport&)GetImport(); } SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); } public: SwXMLDocContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList ); virtual ~SwXMLDocContext_Impl(); TYPEINFO(); virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ); }; SwXMLDocContext_Impl::SwXMLDocContext_Impl( SwXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const Reference< xml::sax::XAttributeList > & xAttrList ) : SvXMLImportContext( rImport, nPrfx, rLName ) { } SwXMLDocContext_Impl::~SwXMLDocContext_Impl() { } TYPEINIT1( SwXMLDocContext_Impl, SvXMLImportContext ); SvXMLImportContext *SwXMLDocContext_Impl::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) { SvXMLImportContext *pContext = 0; const SvXMLTokenMap& rTokenMap = GetSwImport().GetDocElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLocalName ) ) { case XML_TOK_DOC_FONTDECLS: pContext = GetSwImport().CreateFontDeclsContext( rLocalName, xAttrList ); break; case XML_TOK_DOC_STYLES: GetSwImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP ); pContext = GetSwImport().CreateStylesContext( rLocalName, xAttrList, sal_False ); break; case XML_TOK_DOC_AUTOSTYLES: // don't use the autostyles from the styles-document for the progress if ( ! IsXMLToken( GetLocalName(), XML_DOCUMENT_STYLES ) ) GetSwImport().GetProgressBarHelper()->Increment ( PROGRESS_BAR_STEP ); pContext = GetSwImport().CreateStylesContext( rLocalName, xAttrList, sal_True ); break; // case XML_TOK_DOC_USESTYLES: // pContext = GetSwImport().CreateUseStylesContext( rLocalName, // xAttrList ); // break; case XML_TOK_DOC_MASTERSTYLES: pContext = GetSwImport().CreateMasterStylesContext( rLocalName, xAttrList ); break; case XML_TOK_DOC_META: pContext = GetSwImport().CreateMetaContext( rLocalName ); break; case XML_TOK_DOC_SCRIPT: pContext = GetSwImport().CreateScriptContext( rLocalName ); break; case XML_TOK_DOC_BODY: GetSwImport().GetProgressBarHelper()->Increment( PROGRESS_BAR_STEP ); pContext = new SwXMLBodyContext_Impl( GetSwImport(), nPrefix, rLocalName, xAttrList ); break; case XML_TOK_DOC_SETTINGS: pContext = new XMLDocumentSettingsContext( GetImport(), nPrefix, rLocalName, xAttrList ); break; case XML_TOK_DOC_XFORMS: pContext = createXFormsModelContext(GetImport(), nPrefix, rLocalName); break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); return pContext; } //---------------------------------------------------------------------------- const SvXMLTokenMap& SwXMLImport::GetDocElemTokenMap() { if( !pDocElemTokenMap ) pDocElemTokenMap = new SvXMLTokenMap( aDocTokenMap ); return *pDocElemTokenMap; } SvXMLImportContext *SwXMLImport::CreateContext( sal_uInt16 nPrefix, const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) { SvXMLImportContext *pContext = 0; if( XML_NAMESPACE_OFFICE==nPrefix && ( IsXMLToken( rLocalName, XML_DOCUMENT ) || IsXMLToken( rLocalName, XML_DOCUMENT_META ) || IsXMLToken( rLocalName, XML_DOCUMENT_SETTINGS ) || IsXMLToken( rLocalName, XML_DOCUMENT_STYLES ) || IsXMLToken( rLocalName, XML_DOCUMENT_CONTENT ) )) pContext = new SwXMLDocContext_Impl( *this, nPrefix, rLocalName, xAttrList ); else pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList ); return pContext; } // #110680# SwXMLImport::SwXMLImport( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory, sal_uInt16 nImportFlags) : SvXMLImport( xServiceFactory, nImportFlags ), bLoadDoc( sal_True ), bInsert( sal_False ), bBlock( sal_False ), bOrganizerMode( sal_False ), nStyleFamilyMask( SFX_STYLE_FAMILY_ALL ), pDocElemTokenMap( 0 ), pTableElemTokenMap( 0 ), pTableCellAttrTokenMap( 0 ), pTableItemMapper( 0 ), pSttNdIdx( 0 ), bShowProgress( sal_True ), bPreserveRedlineMode( sal_True ), pGraphicResolver( 0 ), pEmbeddedResolver( 0 ) { _InitItemImport(); } #ifdef XML_CORE_API // #110680# SwXMLImport::SwXMLImport( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory, SwDoc& rDoc, const SwPaM& rPaM, sal_Bool bLDoc, sal_Bool bInsertMode, sal_uInt16 nStyleFamMask, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > & rModel, const ::com::sun::star::uno::Reference< ::com::sun::star::document::XGraphicObjectResolver > & rEGO, SvStorage *pPkg ) : SvXMLImport( xServiceFactory, rModel, rEGO ), bLoadDoc( bLDoc ), bInsert( bInsertMode ), nStyleFamilyMask( nStyleFamMask ), pDocElemTokenMap( 0 ), pTableElemTokenMap( 0 ), pTableCellAttrTokenMap( 0 ), pTableItemMapper( 0 ), pSttNdIdx( 0 ), bShowProgress( sal_True ), bPreserveRedlineMode( sal_True ), xPackage( pPkg ) { _InitItemImport(); Reference < XTextRange > xTextRange = SwXTextRange::CreateTextRangeFromPosition( &rDoc, *rPaM.GetPoint(), 0 ); Reference < XText > xText = xTextRange->getText(); Reference < XTextCursor > xTextCursor = xText->createTextCursorByRange( xTextRange ); GetTextImport()->SetCursor( xTextCursor ); } #endif SwXMLImport::~SwXMLImport() throw () { delete pDocElemTokenMap; delete pTableElemTokenMap; delete pTableCellAttrTokenMap; _FinitItemImport(); } void SwXMLImport::setTextInsertMode( const Reference< XTextRange > & rInsertPos ) { bInsert = sal_True; Reference < XText > xText = rInsertPos->getText(); Reference < XTextCursor > xTextCursor = xText->createTextCursorByRange( rInsertPos ); GetTextImport()->SetCursor( xTextCursor ); } void SwXMLImport::setStyleInsertMode( sal_uInt16 nFamilies, sal_Bool bOverwrite ) { bInsert = !bOverwrite; nStyleFamilyMask = nFamilies; bLoadDoc = sal_False; } void SwXMLImport::setBlockMode( ) { bBlock = sal_True; } void SwXMLImport::setOrganizerMode( ) { bOrganizerMode = sal_True; } const Sequence< sal_Int8 > & SwXMLImport::getUnoTunnelId() throw() { static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); return aSeq; } sal_Int64 SAL_CALL SwXMLImport::getSomething( const Sequence< sal_Int8 >& rId ) throw(RuntimeException) { if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) { return (sal_Int64)this; } return SvXMLImport::getSomething( rId ); } OTextCursorHelper *lcl_xml_GetSwXTextCursor( const Reference < XTextCursor >& rTextCursor ) { Reference xCrsrTunnel( rTextCursor, UNO_QUERY ); ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" ); if( !xCrsrTunnel.is() ) return 0; OTextCursorHelper *pTxtCrsr = (OTextCursorHelper *)xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() ); ASSERT( pTxtCrsr, "SwXTextCursor missing" ); return pTxtCrsr; } void SwXMLImport::startDocument( void ) throw( xml::sax::SAXException, uno::RuntimeException ) { // delegate to parent SvXMLImport::startDocument(); DBG_ASSERT( GetModel().is(), "model is missing" ); if( !GetModel().is() ) return; // this method will modify the document directly -> lock SolarMutex vos::OGuard aGuard(Application::GetSolarMutex()); Reference< XPropertySet > xImportInfo( getImportInfo() ); Reference< XPropertySetInfo > xPropertySetInfo; if( xImportInfo.is() ) xPropertySetInfo = xImportInfo->getPropertySetInfo(); if( xPropertySetInfo.is() ) { Any aAny; // insert style mode? OUString sStyleInsertModeFamilies( RTL_CONSTASCII_USTRINGPARAM("StyleInsertModeFamilies")); if( xPropertySetInfo->hasPropertyByName(sStyleInsertModeFamilies) ) { aAny = xImportInfo->getPropertyValue(sStyleInsertModeFamilies); Sequence< OUString> aFamiliesSeq; if( aAny >>= aFamiliesSeq ) { OUString sFrameStyles( RTL_CONSTASCII_USTRINGPARAM ( "FrameStyles" ) ); OUString sPageStyles( RTL_CONSTASCII_USTRINGPARAM ( "PageStyles" ) ); OUString sCharacterStyles( RTL_CONSTASCII_USTRINGPARAM ( "CharacterStyles" ) ); OUString sParagraphStyles( RTL_CONSTASCII_USTRINGPARAM ( "ParagraphStyles" ) ); OUString sNumberingStyles( RTL_CONSTASCII_USTRINGPARAM ( "NumberingStyles" ) ); sal_uInt16 nFamilyMask = 0U; sal_Int32 nCount = aFamiliesSeq.getLength(); const OUString *pSeq = aFamiliesSeq.getConstArray(); for( sal_Int32 i=0; i < nCount; i++ ) { const OUString& rFamily = pSeq[i]; if( rFamily==sFrameStyles ) nFamilyMask |= SFX_STYLE_FAMILY_FRAME; else if( rFamily==sPageStyles ) nFamilyMask |= SFX_STYLE_FAMILY_PAGE; else if( rFamily==sCharacterStyles ) nFamilyMask |= SFX_STYLE_FAMILY_CHAR; else if( rFamily==sParagraphStyles ) nFamilyMask |= SFX_STYLE_FAMILY_PARA; else if( rFamily==sNumberingStyles ) nFamilyMask |= SFX_STYLE_FAMILY_PSEUDO; } sal_Bool bOverwrite = sal_False; OUString sStyleInsertModeOverwrite( RTL_CONSTASCII_USTRINGPARAM("StyleInsertModeOverwrite")); if( xPropertySetInfo->hasPropertyByName(sStyleInsertModeOverwrite) ) { aAny = xImportInfo->getPropertyValue(sStyleInsertModeOverwrite); if( aAny.getValueType() == ::getBooleanCppuType() && *static_cast(aAny.getValue()) ) bOverwrite = sal_True; } setStyleInsertMode( nFamilyMask, bOverwrite ); } } // text insert mode? OUString sTextInsertModeRange( RTL_CONSTASCII_USTRINGPARAM("TextInsertModeRange")); if( xPropertySetInfo->hasPropertyByName(sTextInsertModeRange) ) { aAny = xImportInfo->getPropertyValue(sTextInsertModeRange); Reference xInsertTextRange; if( aAny >>= xInsertTextRange ) setTextInsertMode( xInsertTextRange ); } // auto text mode OUString sAutoTextMode( RTL_CONSTASCII_USTRINGPARAM("AutoTextMode")); if( xPropertySetInfo->hasPropertyByName(sAutoTextMode) ) { aAny = xImportInfo->getPropertyValue(sAutoTextMode); if( aAny.getValueType() == ::getBooleanCppuType() && *static_cast(aAny.getValue()) ) setBlockMode(); } // organizer mode OUString sOrganizerMode( RTL_CONSTASCII_USTRINGPARAM("OrganizerMode")); if( xPropertySetInfo->hasPropertyByName(sOrganizerMode) ) { aAny = xImportInfo->getPropertyValue(sOrganizerMode); if( aAny.getValueType() == ::getBooleanCppuType() && *static_cast(aAny.getValue()) ) setOrganizerMode(); } } // There only is a text cursor by now if we are in insert mode. In any // other case we have to create one at the start of the document. // We also might change into the insert mode later, so we have to make // sure to first set the insert mode and then create the text import // helper. Otherwise it won't have the insert flag set! OTextCursorHelper *pTxtCrsr = 0; Reference < XTextCursor > xTextCursor; if( HasTextImport() ) xTextCursor = GetTextImport()->GetCursor(); if( !xTextCursor.is() ) { Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); Reference < XText > xText = xTextDoc->getText(); xTextCursor = xText->createTextCursor(); SwCrsrShell *pCrsrSh = 0; SwDoc *pDoc = 0; if( IMPORT_ALL == getImportFlags() ) { pTxtCrsr = lcl_xml_GetSwXTextCursor( xTextCursor ); ASSERT( pTxtCrsr, "SwXTextCursor missing" ); if( !pTxtCrsr ) return; pDoc = pTxtCrsr->GetDoc(); ASSERT( pDoc, "SwDoc missing" ); if( !pDoc ) return; // Is there a edit shell. If yes, then we are currently inserting // a document. We then have to insert at the current edit shell's // cursor position. That not quite clean code, but there is no other // way currently. pCrsrSh = pDoc->GetEditShell(); } if( pCrsrSh ) { Reference xInsertTextRange( SwXTextRange::CreateTextRangeFromPosition( pDoc, *pCrsrSh->GetCrsr()->GetPoint(), 0 ) ); setTextInsertMode( xInsertTextRange ); xTextCursor = GetTextImport()->GetCursor(); pTxtCrsr = 0; } else GetTextImport()->SetCursor( xTextCursor ); } if( (getImportFlags() & (IMPORT_CONTENT|IMPORT_MASTERSTYLES)) == 0 ) return; if( !pTxtCrsr ) pTxtCrsr = lcl_xml_GetSwXTextCursor( xTextCursor ); ASSERT( pTxtCrsr, "SwXTextCursor missing" ); if( !pTxtCrsr ) return; SwDoc *pDoc = pTxtCrsr->GetDoc(); ASSERT( pDoc, "SwDoc missing" ); if( !pDoc ) return; if( (getImportFlags() & IMPORT_CONTENT) != 0 && !IsStylesOnlyMode() ) { pSttNdIdx = new SwNodeIndex( pDoc->GetNodes() ); if( IsInsertMode() ) { SwPaM *pPaM = pTxtCrsr->GetPaM(); const SwPosition* pPos = pPaM->GetPoint(); // Split once and remember the node that has been splitted. pDoc->SplitNode( *pPos ); *pSttNdIdx = pPos->nNode.GetIndex()-1; // Split again. pDoc->SplitNode( *pPos ); // Insert all content into the new node pPaM->Move( fnMoveBackward ); pDoc->SetTxtFmtColl ( *pPaM, pDoc->GetTxtCollFromPoolSimple(RES_POOLCOLL_STANDARD, FALSE) ); } } // We need a draw model to be able to set the z order pDoc->MakeDrawModel(); if( !GetGraphicResolver().is() ) { pGraphicResolver = SvXMLGraphicHelper::Create( GRAPHICHELPER_MODE_READ ); Reference< document::XGraphicObjectResolver > xGraphicResolver( pGraphicResolver ); SetGraphicResolver( xGraphicResolver ); } if( !GetEmbeddedResolver().is() ) { SfxObjectShell *pPersist = pDoc->GetPersist(); if( pPersist ) { pEmbeddedResolver = SvXMLEmbeddedObjectHelper::Create( *pPersist, EMBEDDEDOBJECTHELPER_MODE_READ ); Reference< document::XEmbeddedObjectResolver > xEmbeddedResolver( pEmbeddedResolver ); SetEmbeddedResolver( xEmbeddedResolver ); } } } void SwXMLImport::endDocument( void ) throw( xml::sax::SAXException, uno::RuntimeException ) { DBG_ASSERT( GetModel().is(), "model missing; maybe startDocument wasn't called?" ); if( !GetModel().is() ) return; // this method will modify the document directly -> lock SolarMutex vos::OGuard aGuard(Application::GetSolarMutex()); if( pGraphicResolver ) SvXMLGraphicHelper::Destroy( pGraphicResolver ); if( pEmbeddedResolver ) SvXMLEmbeddedObjectHelper::Destroy( pEmbeddedResolver ); // Clear the shape import to sort the shapes (and not in the // destructor that might be called after the import has finished // for Java filters. if( HasShapeImport() ) ClearShapeImport(); SwDoc *pDoc = 0; if( (getImportFlags() & IMPORT_CONTENT) != 0 && !IsStylesOnlyMode() ) { Reference xCrsrTunnel( GetTextImport()->GetCursor(), UNO_QUERY); ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for Cursor" ); OTextCursorHelper *pTxtCrsr = (OTextCursorHelper*)xCrsrTunnel->getSomething( OTextCursorHelper::getUnoTunnelId() ); ASSERT( pTxtCrsr, "SwXTextCursor missing" ); SwPaM *pPaM = pTxtCrsr->GetPaM(); if( IsInsertMode() && pSttNdIdx->GetIndex() ) { // If we are in insert mode, join the splitted node that is in front // of the new content with the first new node. Or in other words: // Revert the first split node. SwTxtNode* pTxtNode = pSttNdIdx->GetNode().GetTxtNode(); SwNodeIndex aNxtIdx( *pSttNdIdx ); if( pTxtNode && pTxtNode->CanJoinNext( &aNxtIdx ) && pSttNdIdx->GetIndex() + 1 == aNxtIdx.GetIndex() ) { // If the PaM points to the first new node, move the PaM to the // end of the previous node. if( pPaM->GetPoint()->nNode == aNxtIdx ) { pPaM->GetPoint()->nNode = *pSttNdIdx; pPaM->GetPoint()->nContent.Assign( pTxtNode, pTxtNode->GetTxt().Len() ); } #ifndef PRODUCT // !!! This should be impossible !!!! ASSERT( pSttNdIdx->GetIndex()+1 != pPaM->GetBound( sal_True ).nNode.GetIndex(), "PaM.Bound1 point to new node " ); ASSERT( pSttNdIdx->GetIndex()+1 != pPaM->GetBound( sal_False ).nNode.GetIndex(), "PaM.Bound2 points to new node" ); if( pSttNdIdx->GetIndex()+1 == pPaM->GetBound( sal_True ).nNode.GetIndex() ) { sal_uInt16 nCntPos = pPaM->GetBound( sal_True ).nContent.GetIndex(); pPaM->GetBound( sal_True ).nContent.Assign( pTxtNode, pTxtNode->GetTxt().Len() + nCntPos ); } if( pSttNdIdx->GetIndex()+1 == pPaM->GetBound( sal_False ).nNode.GetIndex() ) { sal_uInt16 nCntPos = pPaM->GetBound( sal_False ).nContent.GetIndex(); pPaM->GetBound( sal_False ).nContent.Assign( pTxtNode, pTxtNode->GetTxt().Len() + nCntPos ); } #endif // If the first new node isn't empty, convert the node's text // attributes into hints. Otherwise, set the new node's // paragraph style at the previous (empty) node. SwTxtNode* pDelNd = aNxtIdx.GetNode().GetTxtNode(); if( pTxtNode->GetTxt().Len() ) pDelNd->FmtToTxtAttr( pTxtNode ); else pTxtNode->ChgFmtColl( pDelNd->GetTxtColl() ); pTxtNode->JoinNext(); } } SwPosition* pPos = pPaM->GetPoint(); DBG_ASSERT( !pPos->nContent.GetIndex(), "last paragraph isn't empty" ); if( !pPos->nContent.GetIndex() ) { SwTxtNode* pCurrNd; sal_uInt32 nNodeIdx = pPos->nNode.GetIndex(); pDoc = pPaM->GetDoc(); DBG_ASSERT( pPos->nNode.GetNode().IsCntntNode(), "insert position is not a content node" ); if( !IsInsertMode() ) { // If we're not in insert mode, the last node is deleted. const SwNode *pPrev = pDoc->GetNodes()[nNodeIdx -1]; if( pPrev->IsCntntNode() || ( pPrev->IsEndNode() && pPrev->StartOfSectionNode()->IsSectionNode() ) ) { SwCntntNode* pCNd = pPaM->GetCntntNode(); if( pCNd && pCNd->StartOfSectionIndex()+2 < pCNd->EndOfSectionIndex() ) { pPaM->GetBound(sal_True).nContent.Assign( 0, 0 ); pPaM->GetBound(sal_False).nContent.Assign( 0, 0 ); pDoc->GetNodes().Delete( pPaM->GetPoint()->nNode ); } } } else if( 0 != (pCurrNd = pDoc->GetNodes()[nNodeIdx]->GetTxtNode()) ) { // Id we're in insert mode, the empty node is joined with // the next and the previous one. if( pCurrNd->CanJoinNext( &pPos->nNode )) { SwTxtNode* pNextNd = pPos->nNode.GetNode().GetTxtNode(); pPos->nContent.Assign( pNextNd, 0 ); pPaM->SetMark(); pPaM->DeleteMark(); pNextNd->JoinPrev(); // Remove line break that has been inserted by the import, // but only if one has been inserted! if( pNextNd->CanJoinPrev(/* &pPos->nNode*/ ) && *pSttNdIdx != pPos->nNode ) { // SwTxtNode* pPrevNd = pPos->nNode.GetNode().GetTxtNode(); // pPos->nContent.Assign( pPrevNd, 0 ); // pPaM->SetMark(); pPaM->DeleteMark(); // pPrevNd->JoinNext(); pNextNd->JoinPrev(); } } else if( !pCurrNd->GetTxt().Len() ) { pPos->nContent.Assign( 0, 0 ); pPaM->SetMark(); pPaM->DeleteMark(); pDoc->GetNodes().Delete( pPos->nNode, 1 ); pPaM->Move( fnMoveBackward ); } } } } /* #108146# Was called too early. Moved from SwXMLBodyContext_Impl::EndElement */ GetTextImport()->RedlineAdjustStartNodeCursor( sal_False ); if( (getImportFlags() & IMPORT_CONTENT) != 0 || ((getImportFlags() & IMPORT_MASTERSTYLES) != 0 && IsStylesOnlyMode()) ) { // pDoc might be 0. In this case UpdateTxtCollCondition is looking // for it itself. UpdateTxtCollConditions( pDoc ); } GetTextImport()->ResetCursor(); delete pSttNdIdx; pSttNdIdx = 0; if( (getImportFlags() == IMPORT_ALL ) ) { // Notify math objects. If we are in the package filter this will // be done by the filter object itself if( IsInsertMode() ) pDoc->PrtOLENotify( FALSE ); else if ( pDoc->IsOLEPrtNotifyPending() ) pDoc->PrtOLENotify( TRUE ); } // delegate to parent: takes care of error handling SvXMLImport::endDocument(); } // Locally derive XMLTextShapeImportHelper, so we can take care of the // form import This is Writer, but not text specific, so it should go // here! class SvTextShapeImportHelper : public XMLTextShapeImportHelper { // hold own reference form import helper, because the SvxImport // stored in the superclass, from whom we originally got the // reference, is already destroyed when we want to use it in the // destructor UniReference< ::xmloff::OFormLayerXMLImport > rFormImport; // hold reference to the one page (if it exists) for calling startPage() // and endPage. If !xPage.is(), then this document doesn't have a // XDrawPage. Reference xPage; public: SvTextShapeImportHelper(SvXMLImport& rImp); virtual ~SvTextShapeImportHelper(); }; SvTextShapeImportHelper::SvTextShapeImportHelper(SvXMLImport& rImp) : XMLTextShapeImportHelper(rImp) { Reference xSupplier(rImp.GetModel(),UNO_QUERY); if (xSupplier.is()) { if (rImp.GetFormImport().is()) { rImp.GetFormImport()->startPage(xSupplier->getDrawPage()); rFormImport = rImp.GetFormImport(); } xPage = xSupplier->getDrawPage(); Reference xShapes( xPage, UNO_QUERY ); XMLShapeImportHelper::startPage( xShapes ); } } SvTextShapeImportHelper::~SvTextShapeImportHelper() { rFormImport->endPage(); if (xPage.is()) { Reference xShapes( xPage, UNO_QUERY ); XMLShapeImportHelper::endPage(xShapes); } } XMLShapeImportHelper* SwXMLImport::CreateShapeImport() { return new SvTextShapeImportHelper( *this ); } SvXMLImportContext *SwXMLImport::CreateFontDeclsContext( const OUString& rLocalName, const Reference< xml::sax::XAttributeList > & xAttrList ) { XMLFontStylesContext *pFSContext = new XMLFontStylesContext( *this, XML_NAMESPACE_OFFICE, rLocalName, xAttrList, gsl_getSystemTextEncoding() ); SetFontDecls( pFSContext ); return pFSContext; } void SwXMLImport::SetViewSettings(const Sequence < PropertyValue > & aViewProps) { if (IsInsertMode() || IsStylesOnlyMode() || IsBlockMode() || IsOrganizerMode() || !GetModel().is() ) return; // this method will modify the document directly -> lock SolarMutex vos::OGuard aGuard(Application::GetSolarMutex()); Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); Reference < XText > xText = xTextDoc->getText(); Reference xTextTunnel( xText, UNO_QUERY); ASSERT( xTextTunnel.is(), "missing XUnoTunnel for Cursor" ); if( !xTextTunnel.is() ) return; SwXText *pText = (SwXText *)xTextTunnel->getSomething( SwXText::getUnoTunnelId() ); ASSERT( pText, "SwXText missing" ); if( !pText ) return; SwDoc *pDoc = pText->GetDoc(); Rectangle aRect; if( pDoc->GetDocShell() ) aRect = pDoc->GetDocShell()->GetVisArea( ASPECT_CONTENT ); //TODO/LATER: why that cast?! //aRect = ((SfxInPlaceObject *)pDoc->GetDocShell())->GetVisArea(); sal_Int32 nCount = aViewProps.getLength(); const PropertyValue *pValue = aViewProps.getConstArray(); long nTmp; sal_Bool bShowRedlineChanges = sal_False, bBrowseMode = sal_False; sal_Bool bChangeShowRedline = sal_False, bChangeBrowseMode = sal_False; //TODO/LATER: why that cast?! sal_Bool bTwip = pDoc->GetDocShell()->GetMapUnit ( ) == MAP_TWIP; //sal_Bool bTwip = pDoc->GetDocShell()->SfxInPlaceObject::GetMapUnit ( ) == MAP_TWIP; for (sal_Int32 i = 0; i < nCount ; i++) { if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ViewAreaTop" ) ) ) { pValue->Value >>= nTmp; aRect.setY( bTwip ? MM100_TO_TWIP ( nTmp ) : nTmp ); } else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ViewAreaLeft" ) ) ) { pValue->Value >>= nTmp; aRect.setX( bTwip ? MM100_TO_TWIP ( nTmp ) : nTmp ); } else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ViewAreaWidth" ) ) ) { pValue->Value >>= nTmp; Size aSize( aRect.GetSize() ); aSize.Width() = bTwip ? MM100_TO_TWIP ( nTmp ) : nTmp; aRect.SetSize( aSize ); } else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ViewAreaHeight" ) ) ) { pValue->Value >>= nTmp; Size aSize( aRect.GetSize() ); aSize.Height() = bTwip ? MM100_TO_TWIP ( nTmp ) : nTmp; aRect.SetSize( aSize ); } else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ShowRedlineChanges" ) ) ) { bShowRedlineChanges = *(sal_Bool *)(pValue->Value.getValue()); bChangeShowRedline = sal_True; } // #105372#: Headers and footers are not displayed in BrowseView anymore // else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ShowHeaderWhileBrowsing" ) ) ) // else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ShowFooterWhileBrowsing" ) ) ) else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "InBrowseMode" ) ) ) { bBrowseMode = *(sal_Bool *)(pValue->Value.getValue()); bChangeBrowseMode = sal_True; } pValue++; } if( pDoc->GetDocShell() ) pDoc->GetDocShell()->SetVisArea ( aRect ); if (bChangeBrowseMode) pDoc->SetBrowseMode ( bBrowseMode ); if (bChangeShowRedline) GetTextImport()->SetShowChanges( bShowRedlineChanges ); } void SwXMLImport::SetConfigurationSettings(const Sequence < PropertyValue > & aConfigProps) { // this method will modify the document directly -> lock SolarMutex vos::OGuard aGuard(Application::GetSolarMutex()); Reference< lang::XMultiServiceFactory > xFac( GetModel(), UNO_QUERY ); if( !xFac.is() ) return; Reference< XPropertySet > xProps( xFac->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.Settings" ) ) ), UNO_QUERY ); if( !xProps.is() ) return; Reference< XPropertySetInfo > xInfo( xProps->getPropertySetInfo() ); if( !xInfo.is() ) return; // #111955# hash_set< String, StringHashRef, StringEqRef > aSet; aSet.insert(String("ForbiddenCharacters", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("IsKernAsianPunctuation", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("CharacterCompressionType", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("LinkUpdateMode", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("FieldAutoUpdate", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("ChartAutoUpdate", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("AddParaTableSpacing", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("AddParaTableSpacingAtStart", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintAnnotationMode", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintBlackFonts", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintControls", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintDrawings", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintGraphics", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintLeftPages", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintPageBackground", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintProspect", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintReversed", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintRightPages", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintFaxName", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintPaperFromSetup", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintTables", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrintSingleJobs", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("UpdateFromTemplate", RTL_TEXTENCODING_ASCII_US)); aSet.insert(String("PrinterIndependentLayout", RTL_TEXTENCODING_ASCII_US)); sal_Int32 nCount = aConfigProps.getLength(); const PropertyValue* pValues = aConfigProps.getConstArray(); SvtSaveOptions aSaveOpt; BOOL bIsUserSetting = aSaveOpt.IsLoadUserSettings(), bSet = bIsUserSetting; // for some properties we don't want to use the application // default if they're missing. So we watch for them in the loop // below, and set them if not found bool bPrinterIndependentLayout = false; bool bUseOldNumbering = false; // #111955# bool bAddExternalLeading = false; // OD 2004-02-16 #106629# bool bAddParaSpacingToTableCells = false; // DVO, OD 12.01.2004 #i11859# bool bUseFormerLineSpacing = false; // OD 2004-03-17 #i11860# bool bUseFormerObjectPositioning = false; // --> FME #108724# bool bUseFormerTextWrapping = false; // --> OD 2004-07-08 #i28701# bool bConsiderWrapOnObjPos = false; // --> PB 2004-08-23 #i33095# bool bLoadReadonly = false; OUString sRedlineProtectionKey( RTL_CONSTASCII_USTRINGPARAM( "RedlineProtectionKey" ) ); while( nCount-- ) { ULONG nHash = 0; if( !bIsUserSetting ) { // test over the hash value if the entry is in the table. String aStr(pValues->Name); bSet = aSet.find(aStr) == aSet.end(); } if( bSet ) { try { if( xInfo->hasPropertyByName( pValues->Name ) ) { if( pValues->Name.equals( sRedlineProtectionKey ) ) { Sequence aKey; pValues->Value >>= aKey; GetTextImport()->SetChangesProtectionKey( aKey ); } else { xProps->setPropertyValue( pValues->Name, pValues->Value ); } } // did we find any of the non-default cases? if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("PrinterIndependentLayout")) ) bPrinterIndependentLayout = true; else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("AddExternalLeading")) ) bAddExternalLeading = true; // OD 2004-02-16 #106629# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("AddParaSpacingToTableCells")) ) bAddParaSpacingToTableCells = true; // DVO, OD 12.01.2004 #i11859# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("UseFormerLineSpacing")) ) bUseFormerLineSpacing = true; // OD 2004-03-17 #i11860# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("UseFormerObjectPositioning")) ) bUseFormerObjectPositioning = true; // FME #108724# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("UseFormerTextWrapping")) ) bUseFormerTextWrapping = true; // #111955# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("UseOldNumbering")) ) bUseOldNumbering = true; // --> OD 2004-07-08 #i28701# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ConsiderTextWrapOnObjPos")) ) bConsiderWrapOnObjPos = true; // <-- // --> PB 2004-08-23 #i33095# else if( pValues->Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("LoadReadonly")) ) bLoadReadonly = true; // <-- } catch( Exception& ) { DBG_ERROR( "SwXMLImport::SetConfigurationSettings: Exception!" ); } } pValues++; } // finally, treat the non-default cases if( ! bPrinterIndependentLayout ) { Any aAny; sal_Int16 nTmp = document::PrinterIndependentLayout::DISABLED; aAny <<= nTmp; xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("PrinterIndependentLayout") ), aAny ); } if( ! bAddExternalLeading ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("AddExternalLeading")), makeAny( false ) ); } // OD 12.01.2004 #i11859# if( ! bUseFormerLineSpacing ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("UseFormerLineSpacing")), makeAny( true ) ); } // OD 2004-03-17 #i11860# if( !bUseFormerObjectPositioning ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("UseFormerObjectPositioning")), makeAny( true ) ); } if( !bUseOldNumbering ) // #111955# { Any aAny; sal_Bool bOldNum = true; aAny.setValue(&bOldNum, ::getBooleanCppuType()); xProps->setPropertyValue (OUString( RTL_CONSTASCII_USTRINGPARAM("UseOldNumbering")), aAny ); } // OD 2004-02-16 #106629# if( !bAddParaSpacingToTableCells ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("AddParaSpacingToTableCells")), makeAny( false ) ); } // --> FME #108724# if( !bUseFormerTextWrapping ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("UseFormerTextWrapping")), makeAny( true ) ); } // <-- // --> OD 2004-07-08 #i28701# if( !bConsiderWrapOnObjPos ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("ConsiderTextWrapOnObjPos")), makeAny( false ) ); } // <-- // --> PB 2004-08-23 #i33095# if ( !bLoadReadonly ) { xProps->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM("LoadReadonly") ), makeAny( false ) ); } // <-- Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); Reference < XText > xText = xTextDoc->getText(); Reference xTextTunnel( xText, UNO_QUERY); ASSERT( xTextTunnel.is(), "missing XUnoTunnel for Cursor" ); if( xTextTunnel.is() ) { SwXText *pText = (SwXText *)xTextTunnel->getSomething( SwXText::getUnoTunnelId() ); ASSERT( pText, "SwXText missing" ); if( pText ) { SwDoc *pDoc = pText->GetDoc(); if( pDoc ) { // If the printer is known, then the OLE objects will // already have correct sizes, and we don't have to call // PrtOLENotify again. Otherwise we have to call it. // The flag might be set from setting the printer, so it // it is required to clear it. SfxPrinter *pPrinter = pDoc->GetPrt( sal_False ); if( pPrinter ) pDoc->SetOLEPrtNotifyPending( !pPrinter->IsKnown() ); } } } } void SwXMLImport::initialize( const Sequence& aArguments ) throw( uno::Exception, uno::RuntimeException) { // delegate to super class SvXMLImport::initialize(aArguments); // we are only looking for a PropertyValue "PreserveRedlineMode" sal_Int32 nLength = aArguments.getLength(); for(sal_Int32 i = 0; i < nLength; i++) { if (aArguments[i].getValueType() == ::getCppuType((const beans::PropertyValue*)0) ) { beans::PropertyValue aValue; aArguments[i] >>= aValue; if (aValue.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("PreserveRedlineMode"))) { bPreserveRedlineMode = *(sal_Bool*)aValue.Value.getValue(); } } } } // // UNO component registration helper functions // OUString SAL_CALL SwXMLImport_getImplementationName() throw() { return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Writer.XMLOasisImporter" ) ); } uno::Sequence< OUString > SAL_CALL SwXMLImport_getSupportedServiceNames() throw() { const OUString aServiceName( SwXMLImport_getImplementationName() ); const uno::Sequence< OUString > aSeq( &aServiceName, 1 ); return aSeq; } uno::Reference< uno::XInterface > SAL_CALL SwXMLImport_createInstance( const uno::Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception ) { // #110680# // return (cppu::OWeakObject*)new SwXMLImport(IMPORT_ALL); return (cppu::OWeakObject*)new SwXMLImport( rSMgr, IMPORT_ALL ); } OUString SAL_CALL SwXMLImportStyles_getImplementationName() throw() { return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Writer.XMLOasisStylesImporter" ) ); } uno::Sequence< OUString > SAL_CALL SwXMLImportStyles_getSupportedServiceNames() throw() { const OUString aServiceName( SwXMLImportStyles_getImplementationName() ); const uno::Sequence< OUString > aSeq( &aServiceName, 1 ); return aSeq; } uno::Reference< uno::XInterface > SAL_CALL SwXMLImportStyles_createInstance( const uno::Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception ) { // #110680# //return (cppu::OWeakObject*)new SwXMLImport( // IMPORT_STYLES | IMPORT_MASTERSTYLES | IMPORT_AUTOSTYLES | // IMPORT_FONTDECLS ); return (cppu::OWeakObject*)new SwXMLImport( rSMgr, IMPORT_STYLES | IMPORT_MASTERSTYLES | IMPORT_AUTOSTYLES | IMPORT_FONTDECLS ); } OUString SAL_CALL SwXMLImportContent_getImplementationName() throw() { return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Writer.XMLOasisContentImporter" ) ); } uno::Sequence< OUString > SAL_CALL SwXMLImportContent_getSupportedServiceNames() throw() { const OUString aServiceName( SwXMLImportContent_getImplementationName() ); const uno::Sequence< OUString > aSeq( &aServiceName, 1 ); return aSeq; } uno::Reference< uno::XInterface > SAL_CALL SwXMLImportContent_createInstance( const uno::Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception ) { // #110680# //return (cppu::OWeakObject*)new SwXMLImport( // IMPORT_AUTOSTYLES | IMPORT_CONTENT | IMPORT_SCRIPTS | // IMPORT_FONTDECLS ); return (cppu::OWeakObject*)new SwXMLImport( rSMgr, IMPORT_AUTOSTYLES | IMPORT_CONTENT | IMPORT_SCRIPTS | IMPORT_FONTDECLS ); } OUString SAL_CALL SwXMLImportMeta_getImplementationName() throw() { return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Writer.XMLOasisMetaImporter" ) ); } uno::Sequence< OUString > SAL_CALL SwXMLImportMeta_getSupportedServiceNames() throw() { const OUString aServiceName( SwXMLImportMeta_getImplementationName() ); const uno::Sequence< OUString > aSeq( &aServiceName, 1 ); return aSeq; } uno::Reference< uno::XInterface > SAL_CALL SwXMLImportMeta_createInstance( const uno::Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception ) { // #110680# // return (cppu::OWeakObject*)new SwXMLImport( IMPORT_META ); return (cppu::OWeakObject*)new SwXMLImport( rSMgr, IMPORT_META ); } OUString SAL_CALL SwXMLImportSettings_getImplementationName() throw() { return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Writer.XMLOasisSettingsImporter" ) ); } uno::Sequence< OUString > SAL_CALL SwXMLImportSettings_getSupportedServiceNames() throw() { const OUString aServiceName( SwXMLImportSettings_getImplementationName() ); const uno::Sequence< OUString > aSeq( &aServiceName, 1 ); return aSeq; } uno::Reference< uno::XInterface > SAL_CALL SwXMLImportSettings_createInstance( const uno::Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception ) { // #110680# // return (cppu::OWeakObject*)new SwXMLImport( IMPORT_SETTINGS ); return (cppu::OWeakObject*)new SwXMLImport( rSMgr, IMPORT_SETTINGS ); } // XServiceInfo // override empty method from parent class OUString SAL_CALL SwXMLImport::getImplementationName() throw(RuntimeException) { switch( getImportFlags() ) { case IMPORT_ALL: return SwXMLImport_getImplementationName(); break; case (IMPORT_STYLES|IMPORT_MASTERSTYLES|IMPORT_AUTOSTYLES|IMPORT_FONTDECLS): return SwXMLImportStyles_getImplementationName(); break; case (IMPORT_AUTOSTYLES|IMPORT_CONTENT|IMPORT_SCRIPTS|IMPORT_FONTDECLS): return SwXMLImportContent_getImplementationName(); break; case IMPORT_META: return SwXMLImportMeta_getImplementationName(); break; case IMPORT_SETTINGS: return SwXMLImportSettings_getImplementationName(); break; default: // generic name for 'unknown' cases return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Writer.SwXMLImport" ) ); break; } } void SwXMLImport::initXForms() { // obtain SwDoc Reference xDocTunnel( GetModel(), UNO_QUERY ); if( ! xDocTunnel.is() ) return; SwXTextDocument* pXTextDocument = reinterpret_cast( xDocTunnel->getSomething( SwXTextDocument::getUnoTunnelId() ) ); if( pXTextDocument == NULL ) return; SwDoc *pDoc = pXTextDocument->GetDocShell()->GetDoc(); // init XForms (if not already done) // (no default model, since we'll load the models) if( ! pDoc->isXForms() ) pDoc->initXForms( false ); }