blob: 7596fad9a9863e3eeef2b5d1be6cfb7d75dd8615 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <com/sun/star/text/XTextDocument.hpp>
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/container/XIndexContainer.hpp>
#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/xforms/XFormsSupplier.hpp>
#include <svx/svdmodel.hxx>
#include <svx/svdpage.hxx>
#include <svx/xmleohlp.hxx>
#include <svx/xmlgrhlp.hxx>
#include <editeng/eeitem.hxx>
#include <svx/svddef.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <editeng/xmlcnitm.hxx>
#include <xmloff/ProgressBarHelper.hxx>
#include <xmloff/xmluconv.hxx>
#include <xmloff/xformsexport.hxx>
#include <pam.hxx>
#include <doc.hxx>
#include <swmodule.hxx>
#include <docsh.hxx>
#include <viewsh.hxx>
#include <docstat.hxx>
#include <swerror.h>
#include <unotext.hxx>
#include <xmltexte.hxx>
#include <xmlexp.hxx>
#include <sfx2/viewsh.hxx>
#include <comphelper/processfactory.hxx>
#include <docary.hxx>
#include <editeng/unolingu.hxx>
#include <editeng/forbiddencharacterstable.hxx>
#include <ForbiddenCharactersEnum.hxx>
// for locking SolarMutex: svapp + mutex
#include <vcl/svapp.hxx>
#include <vos/mutex.hxx>
#include <pausethreadstarting.hxx>
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::xml::sax;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::document;
using namespace ::com::sun::star::drawing;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::i18n;
using namespace ::com::sun::star::xforms;
using namespace ::xmloff::token;
#ifdef XML_CORE_API
void SwXMLExport::SetCurPaM( SwPaM& rPaM, sal_Bool bWhole, sal_Bool bTabOnly )
{
if( !pCurPaM )
{
pCurPaM = new SwPaM( *rPaM.End(), *rPaM.Start() );
}
else
{
*pCurPaM->GetPoint() = *rPaM.Start();
*pCurPaM->GetMark() = *rPaM.End();
}
// Set PaM to table/section start node if whole doc should be exported
if( bWhole )
{
SwTableNode *pTblNd = pCurPaM->GetNode()->FindTableNode();
if( pTblNd )
{
pCurPaM->GetPoint()->nNode = *pTblNd;
if( bTabOnly )
pCurPaM->GetMark()->nNode = *pTblNd->EndOfSectionNode();
}
SwSectionNode * pSectNd = pCurPaM->GetNode()->FindSectionNode();
while( pSectNd )
{
pCurPaM->GetPoint()->nNode = *pSectNd;
// SwSectionNode::FindSectionNode() returns the section node itself
pSectNd = pSectNd->StartOfSectionNode()->FindSectionNode();
}
}
}
#endif
// #110680#
SwXMLExport::SwXMLExport(
const uno::Reference< lang::XMultiServiceFactory > xServiceFactory,
sal_uInt16 nExportFlags)
: SvXMLExport( xServiceFactory, MAP_INCH, XML_TEXT, nExportFlags ),
#ifdef XML_CORE_API
pCurPaM( 0 ),
pOrigPaM( &rPaM ),
#endif
pTableItemMapper( 0 ),
pTableLines( 0 ),
#ifdef XML_CORE_API
bExportWholeDoc( bExpWholeDoc ),
bExportFirstTableOnly( bExpFirstTableOnly ),
#endif
bBlock( sal_False ),
bShowProgress( sal_True ),
sNumberFormat(RTL_CONSTASCII_USTRINGPARAM("NumberFormat")),
sIsProtected(RTL_CONSTASCII_USTRINGPARAM("IsProtected")),
sCell(RTL_CONSTASCII_USTRINGPARAM("Cell"))
{
_InitItemExport();
}
#ifdef XML_CORE_API
// #110680#
SwXMLExport::SwXMLExport(
const uno::Reference< lang::XMultiServiceFactory > xServiceFactory,
const Reference< XModel >& rModel,
SwPaM& rPaM,
const OUString& rFileName,
const Reference< XDocumentHandler > & rHandler,
const Reference< XGraphicObjectResolver > & rEmbeddedGrfObjs,
sal_Bool bExpWholeDoc, sal_Bool bExpFirstTableOnly,
sal_Bool bShowProg )
: SvXMLExport( xServiceFactory, rFileName, rHandler, rModel, rEmbeddedGrfObjs,
SW_MOD()->GetMetric( rPaM.GetDoc()->get(IDocumentSettingAccess::HTML_MODE) ) ),
pCurPaM( 0 ),
pOrigPaM( &rPaM ),
pTableItemMapper( 0 ),
pTableLines( 0 ),
bExportWholeDoc( bExpWholeDoc ),
bExportFirstTableOnly( bExpFirstTableOnly ),
bShowProgress( bShowProg ),
sNumberFormat(RTL_CONSTASCII_USTRINGPARAM("NumberFormat")),
sIsProtected(RTL_CONSTASCII_USTRINGPARAM("IsProtected")),
sCell(RTL_CONSTASCII_USTRINGPARAM("Cell"))
{
_InitItemExport();
}
#endif
void SwXMLExport::setBlockMode()
{
bBlock = sal_True;
}
sal_uInt32 SwXMLExport::exportDoc( enum XMLTokenEnum eClass )
{
if( !GetModel().is() )
return ERR_SWG_WRITE_ERROR;
// --> OD 2007-03-30 #i73788#
SwPauseThreadStarting aPauseThreadStarting;
// <--
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 ERR_SWG_WRITE_ERROR;
// from here, we use core interfaces -> lock Solar-Mutex (#91949#)
vos::OGuard aGuard(Application::GetSolarMutex());
{
Reference<XPropertySet> rInfoSet = getExportInfo();
if( rInfoSet.is() )
{
OUString sAutoTextMode(
RTL_CONSTASCII_USTRINGPARAM("AutoTextMode"));
if( rInfoSet->getPropertySetInfo()->hasPropertyByName(
sAutoTextMode ) )
{
Any aAny = rInfoSet->getPropertyValue(sAutoTextMode);
if( aAny.getValueType() == ::getBooleanCppuType() &&
*static_cast<const sal_Bool*>(aAny.getValue()) )
setBlockMode();
}
}
}
SwXText *pText = reinterpret_cast< SwXText * >(
sal::static_int_cast< sal_IntPtr >( xTextTunnel->getSomething( SwXText::getUnoTunnelId() )));
ASSERT( pText, "SwXText missing" );
if( !pText )
return ERR_SWG_WRITE_ERROR;
SwDoc *pDoc = pText->GetDoc();
sal_Bool bExtended = sal_False;
if( (getExportFlags() & (EXPORT_FONTDECLS|EXPORT_STYLES|
EXPORT_MASTERSTYLES|EXPORT_CONTENT)) != 0 )
{
GetTextParagraphExport()->SetBlockMode( bBlock );
const SfxPoolItem* pItem;
const SfxItemPool& rPool = pDoc->GetAttrPool();
sal_uInt16 aWhichIds[5] = { RES_UNKNOWNATR_CONTAINER,
RES_TXTATR_UNKNOWN_CONTAINER,
SDRATTR_XMLATTRIBUTES,
EE_PARA_XMLATTRIBS,
EE_CHAR_XMLATTRIBS };
sal_uInt16 nWhichIds = rPool.GetSecondaryPool() ? 5 : 2;
for( sal_uInt16 j=0; j < nWhichIds; j++ )
{
sal_uInt16 nWhichId = aWhichIds[j];
sal_uInt32 i=0, nItems = rPool.GetItemCount2( nWhichId );
for( i = 0; i < nItems; ++i )
{
if( 0 != (pItem = rPool.GetItem2( nWhichId , i ) ) )
{
const SvXMLAttrContainerItem *pUnknown =
PTR_CAST( SvXMLAttrContainerItem, pItem );
ASSERT( pUnknown, "illegal attribute container item" );
if( pUnknown && (pUnknown->GetAttrCount() > 0) )
{
sal_uInt16 nIdx = pUnknown->GetFirstNamespaceIndex();
while( USHRT_MAX != nIdx )
{
const OUString& rPrefix =
pUnknown->GetPrefix( nIdx );
_GetNamespaceMap().Add( rPrefix,
pUnknown->GetNamespace( nIdx ),
XML_NAMESPACE_UNKNOWN );
nIdx = pUnknown->GetNextNamespaceIndex( nIdx );
}
bExtended = sal_True;
}
}
}
}
}
MapUnit eUnit =
SvXMLUnitConverter::GetMapUnit( SW_MOD()->GetMetric(pDoc->get(IDocumentSettingAccess::HTML_MODE)) );
if( GetMM100UnitConverter().getXMLMeasureUnit() != eUnit )
{
GetMM100UnitConverter().setXMLMeasureUnit( eUnit );
pTwipUnitConv->setXMLMeasureUnit( eUnit );
}
SetExtended( bExtended );
SwDocStat aDocStat( pDoc->GetDocStat() );
if( (getExportFlags() & EXPORT_META) != 0 )
{
// Update doc stat, so that correct values are exported and
// the progress works correctly.
if( aDocStat.bModified )
pDoc->UpdateDocStat( aDocStat );
SfxObjectShell* pObjSh = pDoc->GetDocShell();
if( pObjSh )
pObjSh->UpdateDocInfoForSave(); // update information
}
if( bShowProgress )
{
ProgressBarHelper *pProgress = GetProgressBarHelper();
if( -1 == pProgress->GetReference() )
{
// progress isn't initialized:
// We assume that the whole doc is exported, and the following
// durations:
// - meta information: 2
// - settings: 4 (TODO: not now!)
// - styles (except page styles): 2
// - page styles: 2 (TODO: not now!) + 2 for each paragraph
// - paragraph: 2 (1 for automatic styles and one for content)
// If required, update doc stat, so that
// the progress works correctly.
if( aDocStat.bModified )
pDoc->UpdateDocStat( aDocStat );
// count each item once, and then multiply by two to reach the
// figures given above
// The styles in pDoc also count the default style that never
// gets exported -> subtract one.
sal_Int32 nRef = 1; // meta.xml
nRef += pDoc->GetCharFmts()->Count() - 1;
nRef += pDoc->GetFrmFmts()->Count() - 1;
nRef += pDoc->GetTxtFmtColls()->Count() - 1;
// nRef += pDoc->GetPageDescCnt();
nRef *= 2; // for the above styles, xmloff will increment by 2!
// #i93174#: count all paragraphs for the progress bar
nRef += aDocStat.nAllPara; // 1: only content, no autostyle
pProgress->SetReference( nRef );
pProgress->SetValue( 0 );
}
}
if( (getExportFlags() & (EXPORT_MASTERSTYLES|EXPORT_CONTENT)) != 0 )
{
//Auf die Korrektheit der OrdNums sind wir schon angewiesen.
SdrModel* pModel = pDoc->GetDrawModel();
if( pModel )
pModel->GetPage( 0 )->RecalcObjOrdNums();
}
// adjust document class (eClass)
if (pDoc->get(IDocumentSettingAccess::GLOBAL_DOCUMENT))
{
eClass = XML_TEXT_GLOBAL;
// additionally, we take care of the save-linked-sections-thingy
mbSaveLinkedSections = pDoc->get(IDocumentSettingAccess::GLOBAL_DOCUMENT_SAVE_LINKS);
}
// MIB: 03/26/04: The Label information is saved in the settings, so
// we don't need it here.
// else: keep default pClass that we received
SvXMLGraphicHelper *pGraphicResolver = 0;
if( !GetGraphicResolver().is() )
{
pGraphicResolver = SvXMLGraphicHelper::Create( GRAPHICHELPER_MODE_WRITE );
Reference< XGraphicObjectResolver > xGraphicResolver( pGraphicResolver );
SetGraphicResolver( xGraphicResolver );
}
SvXMLEmbeddedObjectHelper *pEmbeddedResolver = 0;
if( !GetEmbeddedResolver().is() )
{
SfxObjectShell *pPersist = pDoc->GetPersist();
if( pPersist )
{
pEmbeddedResolver = SvXMLEmbeddedObjectHelper::Create(
*pPersist,
EMBEDDEDOBJECTHELPER_MODE_WRITE );
Reference< XEmbeddedObjectResolver > xEmbeddedResolver( pEmbeddedResolver );
SetEmbeddedResolver( xEmbeddedResolver );
}
}
// set redline mode if we export STYLES or CONTENT, unless redline
// mode is taken care of outside (through info XPropertySet)
sal_Bool bSaveRedline =
( (getExportFlags() & (EXPORT_CONTENT|EXPORT_STYLES)) != 0 );
if( bSaveRedline )
{
// if the info property set has a ShowChanges property,
// then change tracking is taken care of on the outside,
// so we don't have to!
Reference<XPropertySet> rInfoSet = getExportInfo();
if( rInfoSet.is() )
{
OUString sShowChanges( RTL_CONSTASCII_USTRINGPARAM("ShowChanges"));
bSaveRedline = ! rInfoSet->getPropertySetInfo()->hasPropertyByName(
sShowChanges );
}
}
sal_uInt16 nRedlineMode = 0;
bSavedShowChanges = IDocumentRedlineAccess::IsShowChanges( pDoc->GetRedlineMode() );
if( bSaveRedline )
{
// now save and switch redline mode
nRedlineMode = pDoc->GetRedlineMode();
pDoc->SetRedlineMode(
(RedlineMode_t)(( nRedlineMode & nsRedlineMode_t::REDLINE_SHOW_MASK ) | nsRedlineType_t::REDLINE_INSERT ));
}
sal_uInt32 nRet = SvXMLExport::exportDoc( eClass );
// now we can restore the redline mode (if we changed it previously)
if( bSaveRedline )
{
pDoc->SetRedlineMode( (RedlineMode_t)(nRedlineMode ));
}
if( pGraphicResolver )
SvXMLGraphicHelper::Destroy( pGraphicResolver );
if( pEmbeddedResolver )
SvXMLEmbeddedObjectHelper::Destroy( pEmbeddedResolver );
ASSERT( !pTableLines, "there are table columns infos left" );
return nRet;
}
XMLTextParagraphExport* SwXMLExport::CreateTextParagraphExport()
{
return new SwXMLTextParagraphExport( *this, *GetAutoStylePool().get() );
}
XMLShapeExport* SwXMLExport::CreateShapeExport()
{
XMLShapeExport* pShapeExport = new XMLShapeExport( *this, XMLTextParagraphExport::CreateShapeExtPropMapper( *this ) );
Reference < XDrawPageSupplier > xDPS( GetModel(), UNO_QUERY );
if( xDPS.is() )
{
Reference < XShapes > xShapes( xDPS->getDrawPage(), UNO_QUERY );
pShapeExport->seekShapes( xShapes );
}
return pShapeExport;
}
__EXPORT SwXMLExport::~SwXMLExport()
{
_FinitItemExport();
}
void SwXMLExport::_ExportFontDecls()
{
GetFontAutoStylePool(); // make sure the pool is created
SvXMLExport::_ExportFontDecls();
}
#define NUM_EXPORTED_VIEW_SETTINGS 11
void SwXMLExport::GetViewSettings(Sequence<PropertyValue>& aProps)
{
Reference< XMultiServiceFactory > xServiceFactory =
comphelper::getProcessServiceFactory();
ASSERT( xServiceFactory.is(),
"XMLReader::Read: got no service manager" );
if( !xServiceFactory.is() )
return;
aProps.realloc( NUM_EXPORTED_VIEW_SETTINGS );
// Currently exporting 9 properties
PropertyValue *pValue = aProps.getArray();
sal_Int32 nIndex = 0;
Reference < XIndexContainer > xBox (xServiceFactory->createInstance
(OUString( RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.document.IndexedPropertyValues") ) ), UNO_QUERY);
if (xBox.is() )
{
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "Views") );
pValue[nIndex++].Value <<= Reference < XIndexAccess > ( xBox, UNO_QUERY );
}
Reference < XText > xText;
SwXText *pText = 0;
if( GetModel().is() )
{
Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY );
xText = xTextDoc->getText();
Reference<XUnoTunnel> xTextTunnel( xText, UNO_QUERY);
ASSERT( xTextTunnel.is(), "missing XUnoTunnel for Cursor" );
if( xTextTunnel.is() )
{
pText = reinterpret_cast< SwXText * >(
sal::static_int_cast< sal_IntPtr >( xTextTunnel->getSomething( SwXText::getUnoTunnelId()) ));
ASSERT( pText, "SwXText missing" );
}
}
if( !pText )
{
aProps.realloc(nIndex);
return;
}
SwDoc *pDoc = pText->GetDoc();
const Rectangle rRect =
pDoc->GetDocShell()->GetVisArea( ASPECT_CONTENT );
sal_Bool bTwip = pDoc->GetDocShell()->GetMapUnit ( ) == MAP_TWIP;
ASSERT ( bTwip, "Map unit for visible area is not in TWIPS!" );
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "ViewAreaTop") );
pValue[nIndex++].Value <<= bTwip ? TWIP_TO_MM100 ( rRect.Top() ) : rRect.Top();
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "ViewAreaLeft") );
pValue[nIndex++].Value <<= bTwip ? TWIP_TO_MM100 ( rRect.Left() ) : rRect.Left();
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "ViewAreaWidth") );
pValue[nIndex++].Value <<= bTwip ? TWIP_TO_MM100 ( rRect.GetWidth() ) : rRect.GetWidth();
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "ViewAreaHeight") );
pValue[nIndex++].Value <<= bTwip ? TWIP_TO_MM100 ( rRect.GetHeight() ) : rRect.GetHeight();
// "show redline mode" cannot simply be read from the document
// since it gets changed during execution. If it's in the info
// XPropertySet, we take it from there.
sal_Bool bShowRedlineChanges = bSavedShowChanges;
Reference<XPropertySet> xInfoSet( getExportInfo() );
if ( xInfoSet.is() )
{
OUString sShowChanges( RTL_CONSTASCII_USTRINGPARAM( "ShowChanges" ));
if( xInfoSet->getPropertySetInfo()->hasPropertyByName( sShowChanges ) )
{
bShowRedlineChanges = *(sal_Bool*) xInfoSet->
getPropertyValue( sShowChanges ).getValue();
}
}
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "ShowRedlineChanges") );
pValue[nIndex++].Value.setValue( &bShowRedlineChanges, ::getBooleanCppuType() );
sal_Bool bInBrowse = pDoc->get(IDocumentSettingAccess::BROWSE_MODE);
pValue[nIndex].Name = OUString( RTL_CONSTASCII_USTRINGPARAM ( "InBrowseMode") );
pValue[nIndex++].Value.setValue( &bInBrowse, ::getBooleanCppuType() );
if ( nIndex < NUM_EXPORTED_VIEW_SETTINGS )
aProps.realloc(nIndex);
}
#undef NUM_EXPORTED_VIEW_SETTINGS
void SwXMLExport::GetConfigurationSettings( Sequence < PropertyValue >& rProps)
{
Reference< XMultiServiceFactory > xFac( GetModel(), UNO_QUERY );
if( xFac.is() )
{
Reference< XPropertySet > xProps( xFac->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.Settings" ) ) ), UNO_QUERY );
if( xProps.is() )
{
// property CurrentDatabaseDataSource needs to be exported before CurrentDatabaseCommand and CurrentDatabaseCommandType
// in order to assure that AOO/OOo versions (before AOO 4.0.1) are able to apply the current database settings correct
// Thus, put CurrentDatabaseDataSource as the first one into the Sequence
// SvXMLUnitConverter::convertPropertySet( rProps, xProps );
uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = xProps->getPropertySetInfo();
if (xPropertySetInfo.is())
{
uno::Sequence< beans::Property > aProps = xPropertySetInfo->getProperties();
const sal_Int32 nCount(aProps.getLength());
if (nCount)
{
rProps.realloc(nCount);
beans::PropertyValue* pProps = rProps.getArray();
static ::rtl::OUString csCurrentDatabaseSource = ::rtl::OUString::createFromAscii("CurrentDatabaseDataSource");
const sal_Bool bHasCurrentDatabaseSource = xPropertySetInfo->hasPropertyByName( csCurrentDatabaseSource );
if ( bHasCurrentDatabaseSource )
{
beans::Property aProp = xPropertySetInfo->getPropertyByName( csCurrentDatabaseSource );
pProps->Name = aProp.Name;
pProps->Value = xProps->getPropertyValue(aProp.Name);
++pProps;
}
for (sal_Int32 i = 0; i < nCount; i++ )
{
if ( bHasCurrentDatabaseSource
&& aProps[i].Name.compareTo( csCurrentDatabaseSource ) == 0 )
{
// nothing to do - already added as first item - see above
}
else
{
pProps->Name = aProps[i].Name;
pProps->Value = xProps->getPropertyValue(aProps[i].Name);
++pProps;
}
}
}
}
}
}
}
sal_Int32 SwXMLExport::GetDocumentSpecificSettings( ::std::list< SettingsGroup >& _out_rSettings )
{
// the only doc-specific settings group we know so far are the XForms settings
uno::Sequence<beans::PropertyValue> aXFormsSettings;
Reference< XFormsSupplier > xXFormsSupp( GetModel(), UNO_QUERY );
Reference< XNameAccess > xXForms;
if ( xXFormsSupp.is() )
xXForms = xXFormsSupp->getXForms().get();
if ( xXForms.is() )
{
getXFormsSettings( xXForms, aXFormsSettings );
_out_rSettings.push_back( SettingsGroup( XML_XFORM_MODEL_SETTINGS, aXFormsSettings ) );
}
return aXFormsSettings.getLength() + SvXMLExport::GetDocumentSpecificSettings( _out_rSettings );
}
void SwXMLExport::SetBodyAttributes()
{
Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY );
Reference < XText > xText = xTextDoc->getText();
// export use of soft page breaks
{
Reference<XUnoTunnel> xTextTunnel( xText, UNO_QUERY);
ASSERT( xTextTunnel.is(), "missing XUnoTunnel for Cursor" );
if( xTextTunnel.is() )
{
SwXText *pText = reinterpret_cast< SwXText * >(
sal::static_int_cast< sal_IntPtr >( xTextTunnel->getSomething( SwXText::getUnoTunnelId() )));
ASSERT( pText, "SwXText missing" );
if( pText )
{
SwDoc *pDoc = pText->GetDoc();
if( pDoc && pDoc->GetCurrentViewShell() &&
pDoc->GetCurrentViewShell()->GetPageCount() > 1 )
{
sal_Bool bValue = sal_True;
rtl::OUStringBuffer sBuffer;
GetMM100UnitConverter().convertBool(sBuffer, bValue);
AddAttribute(XML_NAMESPACE_TEXT, XML_USE_SOFT_PAGE_BREAKS,
sBuffer.makeStringAndClear());
}
}
}
}
}
void SwXMLExport::_ExportContent()
{
// export forms
Reference<XDrawPageSupplier> xDrawPageSupplier(GetModel(), UNO_QUERY);
if (xDrawPageSupplier.is())
{
// export only if we actually have elements
Reference<XDrawPage> xPage = xDrawPageSupplier->getDrawPage();
if (xPage.is())
{
// #103597# prevent export of form controls which are embedded in
// mute sections
Reference<XIndexAccess> xIAPage( xPage, UNO_QUERY );
GetTextParagraphExport()->PreventExportOfControlsInMuteSections(
xIAPage, GetFormExport() );
// #i36597# / 2004-12-13 / fs@openoffice.org
if ( GetFormExport()->pageContainsForms( xPage ) || GetFormExport()->documentContainsXForms() )
{
::xmloff::OOfficeFormsExport aOfficeForms(*this);
GetFormExport()->exportXForms();
GetFormExport()->seekPage(xPage);
GetFormExport()->exportForms(xPage);
}
}
}
Reference<XPropertySet> xPropSet(GetModel(), UNO_QUERY);
if (xPropSet.is())
{
OUString sTwoDigitYear(RTL_CONSTASCII_USTRINGPARAM("TwoDigitYear"));
Any aAny = xPropSet->getPropertyValue( sTwoDigitYear );
aAny <<= (sal_Int16)1930;
sal_Int16 nYear = 0;
aAny >>= nYear;
if (nYear != 1930 )
{
rtl::OUStringBuffer sBuffer;
GetMM100UnitConverter().convertNumber(sBuffer, nYear);
AddAttribute(XML_NAMESPACE_TABLE, XML_NULL_YEAR, sBuffer.makeStringAndClear());
SvXMLElementExport aCalcSettings(*this, XML_NAMESPACE_TABLE, XML_CALCULATION_SETTINGS, sal_True, sal_True);
}
}
GetTextParagraphExport()->exportTrackedChanges( sal_False );
GetTextParagraphExport()->exportTextDeclarations();
Reference < XTextDocument > xTextDoc( GetModel(), UNO_QUERY );
Reference < XText > xText = xTextDoc->getText();
GetTextParagraphExport()->exportFramesBoundToPage( bShowProgress );
GetTextParagraphExport()->exportText( xText, bShowProgress );
}
//
// uno component registration
// helper functions for export service(s)
//
// OOo
OUString SAL_CALL SwXMLExportOOO_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportOOO_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportOOO_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportOOO_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport( rSMgr, EXPORT_ALL);
}
OUString SAL_CALL SwXMLExportStylesOOO_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLStylesExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportStylesOOO_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportStylesOOO_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportStylesOOO_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport( rSMgr,
EXPORT_STYLES | EXPORT_MASTERSTYLES | EXPORT_AUTOSTYLES |
EXPORT_FONTDECLS );
}
OUString SAL_CALL SwXMLExportContentOOO_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLContentExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportContentOOO_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportContentOOO_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportContentOOO_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport(rSMgr,
EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_SCRIPTS |
EXPORT_FONTDECLS );
}
OUString SAL_CALL SwXMLExportMetaOOO_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLMetaExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportMetaOOO_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportMetaOOO_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportMetaOOO_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport( rSMgr, EXPORT_META);
}
OUString SAL_CALL SwXMLExportSettingsOOO_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLSettingsExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportSettingsOOO_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportSettingsOOO_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportSettingsOOO_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport( rSMgr, EXPORT_SETTINGS);
}
// OASIS
OUString SAL_CALL SwXMLExport_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLOasisExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExport_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExport_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExport_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport( rSMgr, EXPORT_ALL|EXPORT_OASIS);
}
OUString SAL_CALL SwXMLExportStyles_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLOasisStylesExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportStyles_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportStyles_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportStyles_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
// #110680#
//return (cppu::OWeakObject*)new SwXMLExport(
// EXPORT_STYLES | EXPORT_MASTERSTYLES | EXPORT_AUTOSTYLES |
// EXPORT_FONTDECLS );
return (cppu::OWeakObject*)new SwXMLExport( rSMgr,
EXPORT_STYLES | EXPORT_MASTERSTYLES | EXPORT_AUTOSTYLES |
EXPORT_FONTDECLS|EXPORT_OASIS );
}
OUString SAL_CALL SwXMLExportContent_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLOasisContentExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportContent_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportContent_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportContent_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
// #110680#
//return (cppu::OWeakObject*)new SwXMLExport(
// EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_SCRIPTS |
// EXPORT_FONTDECLS );
return (cppu::OWeakObject*)new SwXMLExport(
rSMgr,
EXPORT_AUTOSTYLES | EXPORT_CONTENT | EXPORT_SCRIPTS |
EXPORT_FONTDECLS|EXPORT_OASIS );
}
OUString SAL_CALL SwXMLExportMeta_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLOasisMetaExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportMeta_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportMeta_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportMeta_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport(rSMgr, EXPORT_META|EXPORT_OASIS);
}
OUString SAL_CALL SwXMLExportSettings_getImplementationName() throw()
{
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.XMLOasisSettingsExporter" ) );
}
Sequence< OUString > SAL_CALL SwXMLExportSettings_getSupportedServiceNames()
throw()
{
const OUString aServiceName(SwXMLExportSettings_getImplementationName());
const Sequence< OUString > aSeq( &aServiceName, 1 );
return aSeq;
}
Reference< XInterface > SAL_CALL SwXMLExportSettings_createInstance(
const Reference< XMultiServiceFactory > & rSMgr)
throw( Exception )
{
return (cppu::OWeakObject*)new SwXMLExport(rSMgr, EXPORT_SETTINGS|EXPORT_OASIS);
}
const Sequence< sal_Int8 > & SwXMLExport::getUnoTunnelId() throw()
{
static Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
return aSeq;
}
sal_Int64 SAL_CALL SwXMLExport::getSomething( const Sequence< sal_Int8 >& rId )
throw(RuntimeException)
{
if( rId.getLength() == 16
&& 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
rId.getConstArray(), 16 ) )
{
return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
}
return SvXMLExport::getSomething( rId );
}
// XServiceInfo
// override empty method from parent class
OUString SAL_CALL SwXMLExport::getImplementationName()
throw(RuntimeException)
{
switch( getExportFlags() )
{
case EXPORT_ALL:
return SwXMLExport_getImplementationName();
case (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS):
return SwXMLExportStyles_getImplementationName();
case (EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS):
return SwXMLExportContent_getImplementationName();
case EXPORT_META:
return SwXMLExportMeta_getImplementationName();
case EXPORT_SETTINGS:
return SwXMLExportSettings_getImplementationName();
default:
// generic name for 'unknown' cases
return OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.comp.Writer.SwXMLExport" ) );
}
}
#ifdef XML_CORE_API
void SwXMLExport::ExportCurPaM( sal_Bool bExportWholePaM )
{
sal_Bool bFirstNode = sal_True;
sal_Bool bExportWholeNode = bExportWholePaM;
SwXMLNumRuleInfo aPrevNumInfo;
SwXMLNumRuleInfo aNextNumInfo;
while( pCurPaM->GetPoint()->nNode.GetIndex() <
pCurPaM->GetMark()->nNode.GetIndex() ||
( pCurPaM->GetPoint()->nNode.GetIndex() ==
pCurPaM->GetMark()->nNode.GetIndex() &&
pCurPaM->GetPoint()->nContent.GetIndex() <=
pCurPaM->GetMark()->nContent.GetIndex() ) )
{
SwNode *pNd = pCurPaM->GetNode();
aNextNumInfo.Set( *pNd );
ExportListChange( aPrevNumInfo, aNextNumInfo );
ASSERT( !(pNd->IsGrfNode() || pNd->IsOLENode()),
"SwXMLExport::exportCurPaM: grf or OLE node unexpected" );
if( pNd->IsTxtNode() )
{
SwTxtNode* pTxtNd = pNd->GetTxtNode();
if( !bFirstNode )
pCurPaM->GetPoint()->nContent.Assign( pTxtNd, 0 );
ExportTxtNode( *pTxtNd, 0, STRING_LEN, bExportWholeNode );
}
else if( pNd->IsTableNode() )
{
ExportTable( *pNd->GetTableNode() );
}
else if( pNd->IsSectionNode() )
{
ExportSection( *pNd->GetSectionNode() );
}
else if( pNd == &pDoc->GetNodes().GetEndOfContent() )
break;
pCurPaM->GetPoint()->nNode++; // next node
sal_uInt32 nPos = pCurPaM->GetPoint()->nNode.GetIndex();
// if not everything should be exported, the WriteAll flag must be
// set for all but the first and last node anyway.
bExportWholeNode = bExportWholePaM ||
nPos != pCurPaM->GetMark()->nNode.GetIndex();
bFirstNode = sal_False;
aPrevNumInfo = aNextNumInfo;
}
aNextNumInfo.Reset();
ExportListChange( aPrevNumInfo, aNextNumInfo );
}
#endif