diff options
Diffstat (limited to 'binfilter/bf_sw/source/filter/xml/sw_xmlimp.cxx')
-rw-r--r-- | binfilter/bf_sw/source/filter/xml/sw_xmlimp.cxx | 1331 |
1 files changed, 1331 insertions, 0 deletions
diff --git a/binfilter/bf_sw/source/filter/xml/sw_xmlimp.cxx b/binfilter/bf_sw/source/filter/xml/sw_xmlimp.cxx new file mode 100644 index 000000000000..a36c616fa1f9 --- /dev/null +++ b/binfilter/bf_sw/source/filter/xml/sw_xmlimp.cxx @@ -0,0 +1,1331 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +#include <com/sun/star/text/XTextDocument.hpp> +#include <com/sun/star/text/XTextRange.hpp> +#include <com/sun/star/text/XText.hpp> +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/drawing/XShapes.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <bf_xmloff/xmlnmspe.hxx> +#include <bf_xmloff/xmltkmap.hxx> +#include <bf_xmloff/xmlictxt.hxx> +#include <bf_xmloff/txtimp.hxx> +#include <bf_xmloff/nmspmap.hxx> +#include <bf_xmloff/XMLTextShapeImportHelper.hxx> +#include <bf_xmloff/XMLFontStylesContext.hxx> +#include <bf_xmloff/ProgressBarHelper.hxx> +#include <com/sun/star/i18n/XForbiddenCharacters.hpp> +#include <com/sun/star/document/PrinterIndependentLayout.hpp> + +#include <horiornt.hxx> + +#include <doc.hxx> + +#include <errhdl.hxx> + +#include <viscrs.hxx> +#include <unoobj.hxx> +#include "unocrsr.hxx" +#include <poolfmt.hxx> +#include <ndtxt.hxx> +#include <pam.hxx> +#include <editsh.hxx> + +#include "xmlimp.hxx" + +#include <bf_xmloff/DocumentSettingsContext.hxx> + +#include <docsh.hxx> + +#include <bf_svx/unolingu.hxx> +#include <bf_svx/xmlgrhlp.hxx> +#include <bf_svx/xmleohlp.hxx> +#include <bf_sfx2/printer.hxx> + +#include <ForbiddenCharactersEnum.hxx> +#include <bf_xmloff/xmluconv.hxx> +#include <bf_svtools/saveopt.hxx> + +// for locking SolarMutex: svapp + mutex +#include <vcl/svapp.hxx> +#include <sal/macros.h> +#include <osl/mutex.hxx> +namespace binfilter { + + +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 ::binfilter::xmloff::token; + +using rtl::OUString; + +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_OFFICE_END=XML_TOK_UNKNOWN +}; + +static __FAR_DATA SvXMLTokenMapEntry aDocTokenMap[] = +{ + { XML_NAMESPACE_OFFICE, XML_FONT_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_SCRIPT, XML_TOK_DOC_SCRIPT }, + { XML_NAMESPACE_OFFICE, XML_SETTINGS, XML_TOK_DOC_SETTINGS }, + XML_TOKEN_MAP_END +}; + +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(); + + 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 ) +{ + // process document class + // global-text is handled via document shell; + // we only handle label documents + sal_Int16 nLength = xAttrList->getLength(); + for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++) + { + OUString sLocalName; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). + GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), + &sLocalName ); + + if ( (XML_NAMESPACE_OFFICE == nPrefix) && + IsXMLToken( sLocalName, XML_CLASS ) ) + { + if ( IsXMLToken( xAttrList->getValueByIndex(nAttr), XML_LABEL ) ) + { + // OK, we need to set label mode. To do this, tunnel + // to get the SwDoc, then set label mode. + + Reference<XText> xText(GetImport().GetModel(), UNO_QUERY); + Reference<XUnoTunnel> xTunnel( + GetImport().GetTextImport()->GetText(), UNO_QUERY); + DBG_ASSERT(xTunnel.is(), "I can't get the Tunnel"); + SwXText* pText = (SwXText*)xTunnel->getSomething( + SwXText::getUnoTunnelId()); + if (NULL != pText) + { + SwDoc* pDoc = pText->GetDoc(); + if (NULL != pDoc) + pDoc->SetLabelDoc(); + } + } + } + } +} + +SwXMLDocContext_Impl::~SwXMLDocContext_Impl() +{ +} + +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 = GetSwImport().CreateBodyContext( rLocalName ); + break; + case XML_TOK_DOC_SETTINGS: + pContext = new XMLDocumentSettingsContext ( GetImport(), nPrefix, rLocalName, xAttrList ); + 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 = ::binfilter::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<XUnoTunnel> 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 + SolarMutexGuard aGuard; + + // 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<XTextRange> 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() ) + { + SvPersist *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 + SolarMutexGuard aGuard; + + 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<XUnoTunnel> 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() ); + } + +#ifdef DBG_UTIL + // !!! 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; + ULONG 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< ::binfilter::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<drawing::XDrawPage> xPage; + +public: + + SvTextShapeImportHelper(SvXMLImport& rImp); + virtual ~SvTextShapeImportHelper(); +}; + +SvTextShapeImportHelper::SvTextShapeImportHelper(SvXMLImport& rImp) : + XMLTextShapeImportHelper(rImp) +{ + Reference<drawing::XDrawPageSupplier> 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> xShapes( xPage, UNO_QUERY ); + XMLShapeImportHelper::startPage( xShapes ); + } +} + +SvTextShapeImportHelper::~SvTextShapeImportHelper() +{ + rFormImport->endPage(); + + if (xPage.is()) + { + Reference<XShapes> 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 + SolarMutexGuard aGuard; + + Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); + Reference < XText > xText = xTextDoc->getText(); + Reference<XUnoTunnel> 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 = ((SfxInPlaceObject *)pDoc->GetDocShell())->GetVisArea(); + + sal_Int32 nCount = aViewProps.getLength(); + const PropertyValue *pValue = aViewProps.getConstArray(); + + long nTmp; + sal_Bool bShowRedlineChanges = sal_False, bBrowseMode = sal_False, + bShowFooter = sal_False, bShowHeader = sal_False; + sal_Bool bChangeShowRedline = sal_False, bChangeBrowseMode = sal_False, + bChangeFooter = sal_False, bChangeHeader = sal_False; + + 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; + } + else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ShowHeaderWhileBrowsing" ) ) ) + { + bShowHeader = *(sal_Bool *)(pValue->Value.getValue()); + bChangeFooter = sal_True; + } + else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "ShowFooterWhileBrowsing" ) ) ) + { + bShowFooter = *(sal_Bool *)(pValue->Value.getValue()); + bChangeHeader = sal_True; + } + 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 (bChangeHeader) + pDoc->SetHeadInBrowse ( bShowHeader ); + if (bChangeFooter) + pDoc->SetFootInBrowse ( bShowFooter ); + 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 + SolarMutexGuard aGuard; + + 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; + + // static array of setting names which are not loaded. + // This table is created with the iout commended procedure. This will + // be need if anybody add more or change strings!!! + /* + program to calculate the best hash parameters for the property names. +----------------------------------------------------------------- +#include <stdio.h> +#include <string.h> + +#include <sal/macros.h> + + const char* aNmArr[] = { + "ForbiddenCharacters" , + "IsKernAsianPunctuation" , + "CharacterCompressionType" , + "LinkUpdateMode" , + "FieldAutoUpdate" , + "ChartAutoUpdate" , + "AddParaTableSpacing" , + "AddParaTableSpacingAtStart" , + "PrintAnnotationMode" , + "PrintBlackFonts" , + "PrintControls" , + "PrintDrawings" , + "PrintGraphics" , + "PrintLeftPages" , + "PrintPageBackground" , + "PrintProspect" , + "PrintReversed" , + "PrintRightPages" , + "PrintFaxName" , + "PrintPaperFromSetup" , + "PrintTables" , + "PrintSingleJobs", + "UpdateFromTemplate", + "PrinterIndependentLayout" + }; +#define TBL_MAX 100 +int aArr[ TBL_MAX ]; +int nPrime, nSub; + +unsigned long calc_hash( const char* p ) +{ + unsigned long ii = 0; + while( *p ) + ii = (ii * nPrime) ^ ( *p++ - nSub ); + return ii; +} +int Chk_Unique_hashValue( unsigned short nTblSize ) +{ + memset( aArr, 0, sizeof( aArr ) ); + unsigned long ii; + for( int n = 0; n < SAL_N_ELEMENTS( aNmArr ); ++n ) + { + ii = calc_hash( aNmArr[ n ] ) % nTblSize; + if( aArr[ ii ] ) + break; + aArr[ ii ] = 1; + } + return n == SAL_N_ELEMENTS( aNmArr ); +} + +void Show_Result( unsigned short nTblSize ) +{ + printf( "\nTblSz = %d\n", nTblSize ); + for( int n = 0; n < SAL_N_ELEMENTS( aNmArr ); ++n ) + { + unsigned long ii = calc_hash( aNmArr[ n ] ) % nTblSize; + printf( "%-30s -> %3d\n", aNmArr[ n ], ii ); + } +} + +void main() +{ + int nPrm = nPrime, nSb = nSub; + unsigned short nLTbl = TBL_MAX, nTblSize; + + for( nSub = ' '; nSub < 127; ++nSub ) + for( nPrime = 13 ; nPrime < 99; ++nPrime ) + for( nTblSize = SAL_N_ELEMENTS( aNmArr ); + nTblSize < TBL_MAX; ++nTblSize ) + if( Chk_Unique_hashValue( nTblSize )) + { + if( nLTbl > nTblSize ) + { + nLTbl = nTblSize; + nPrm = nPrime; + nSb = nSub; + } + break; + } + + nPrime = nPrm; + nSub = nSb; + nTblSize = nLTbl; + + Show_Result( nTblSize ); + printf( "\nPrime: %d, nSub: %d, TblSz = %d - %d", nPrime, nSub, + SAL_N_ELEMENTS( aNmArr ), nTblSize ); +} +----------------------------------------------------------------- + */ + static const struct { + const sal_Char* pName; + sal_uInt16 nLen; + } aNotSetArr[40] = { +/* 0*/ {0,0}, +/* 1*/ {RTL_CONSTASCII_STRINGPARAM( "PrintTables" )}, +/* 2*/ {RTL_CONSTASCII_STRINGPARAM( "ForbiddenCharacters" )}, +/* 3*/ {0,0}, +/* 4*/ {0,0}, +/* 5*/ {RTL_CONSTASCII_STRINGPARAM( "AddParaTableSpacingAtStart" )}, +/* 6*/ {0,0}, +/* 7*/ {RTL_CONSTASCII_STRINGPARAM( "CharacterCompressionType" )}, +/* 8*/ {0,0}, +/* 9*/ {RTL_CONSTASCII_STRINGPARAM( "PrintDrawings" )}, +/*10*/ {RTL_CONSTASCII_STRINGPARAM( "PrintRightPages" )}, +/*11*/ {RTL_CONSTASCII_STRINGPARAM( "PrintPageBackground" )}, +/*12*/ {RTL_CONSTASCII_STRINGPARAM( "LinkUpdateMode" )}, +/*13*/ {RTL_CONSTASCII_STRINGPARAM( "UpdateFromTemplate" )}, +/*14*/ {0,0}, +/*15*/ {RTL_CONSTASCII_STRINGPARAM( "PrintBlackFonts" )}, +/*16*/ {RTL_CONSTASCII_STRINGPARAM( "PrintSingleJobs" )}, +/*17*/ {RTL_CONSTASCII_STRINGPARAM( "ChartAutoUpdate" )}, +/*18*/ {RTL_CONSTASCII_STRINGPARAM( "IsKernAsianPunctuation" )}, +/*19*/ {RTL_CONSTASCII_STRINGPARAM( "AddParaTableSpacing" )}, +/*20*/ {0,0}, +/*21*/ {0,0}, +/*22*/ {0,0}, +/*23*/ {0,0}, +/*24*/ {RTL_CONSTASCII_STRINGPARAM( "PrintReversed" )}, +/*25*/ {RTL_CONSTASCII_STRINGPARAM( "FieldAutoUpdate" )}, +/*26*/ {RTL_CONSTASCII_STRINGPARAM( "PrintProspect" )}, +/*27*/ {0,0}, +/*28*/ {RTL_CONSTASCII_STRINGPARAM( "PrintControls" )}, +/*29*/ {0,0}, +/*30*/ {RTL_CONSTASCII_STRINGPARAM( "PrintAnnotationMode" )}, +/*31*/ {RTL_CONSTASCII_STRINGPARAM( "PrintGraphics" )}, +/*32*/ {RTL_CONSTASCII_STRINGPARAM( "PrinterIndependentLayout" )}, +/*33*/ {0,0}, +/*34*/ {0,0}, +/*35*/ {RTL_CONSTASCII_STRINGPARAM( "PrintPaperFromSetup" )}, +/*36*/ {RTL_CONSTASCII_STRINGPARAM( "PrintLeftPages" )}, +/*37*/ {RTL_CONSTASCII_STRINGPARAM( "PrintFaxName" )}, +/*38*/ {0,0}, +/*39*/ {0,0}, + }; + const ULONG nPrime = 51; + const ULONG nSub = 51; + + 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; + + while( nCount-- ) + { + ULONG nHash = 0; + if( !bIsUserSetting ) + { + // test over the hash value if the entry is in the table. + const sal_Unicode* p = pValues->Name; + for( ULONG nLen = pValues->Name.getLength(); nLen; --nLen, ++p ) + nHash = (nHash * nPrime) ^ ( *p - nSub ); + nHash %= SAL_N_ELEMENTS( aNotSetArr ); + bSet = 0 == aNotSetArr[ nHash ].pName || + !pValues->Name.equalsAsciiL( + aNotSetArr[ nHash ].pName, + aNotSetArr[ nHash ].nLen ); + } + + if( bSet ) + { + try + { + if( xInfo->hasPropertyByName( pValues->Name ) ) + { + 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; + + } + 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 ); + } + + Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY ); + Reference < XText > xText = xTextDoc->getText(); + Reference<XUnoTunnel> 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<Any>& 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.XMLImporter" ) ); +} + +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.XMLStylesImporter" ) ); +} + +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.XMLContentImporter" ) ); +} + +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.XMLMetaImporter" ) ); +} + +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.XMLSettingsImporter" ) ); +} + +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; + } +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |