diff options
Diffstat (limited to 'sw/source/uibase/uno/unotxdoc.cxx')
-rw-r--r-- | sw/source/uibase/uno/unotxdoc.cxx | 3992 |
1 files changed, 3992 insertions, 0 deletions
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx new file mode 100644 index 000000000000..aa38a1ca03ea --- /dev/null +++ b/sw/source/uibase/uno/unotxdoc.cxx @@ -0,0 +1,3992 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <osl/mutex.hxx> +#include <vcl/image.hxx> +#include <vcl/virdev.hxx> +#include <vcl/svapp.hxx> +#include <vcl/print.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/sfxbasecontroller.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/printer.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <toolkit/awt/vclxdevice.hxx> +#include <cmdid.h> +#include <swtypes.hxx> +#include <wdocsh.hxx> +#include <wrtsh.hxx> +#include <pview.hxx> +#include <viewsh.hxx> +#include <pvprtdat.hxx> +#include <printdata.hxx> +#include <svl/stritem.hxx> +#include <unotxdoc.hxx> +#include <svl/numuno.hxx> +#include <fldbas.hxx> +#include <unotextbodyhf.hxx> +#include <unotextrange.hxx> +#include <unotextcursor.hxx> +#include <unosett.hxx> +#include <unocoll.hxx> +#include <unoredlines.hxx> +#include <unosrch.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/request.hxx> +#include <sfx2/objsh.hxx> +#include <unoprnms.hxx> +#include <unostyle.hxx> +#include <unodraw.hxx> +#include <svl/eitem.hxx> +#include <pagedesc.hxx> +#include <unotools/textsearch.hxx> +#include <unocrsr.hxx> +#include <unofieldcoll.hxx> +#include <unoidxcoll.hxx> +#include <unocrsrhelper.hxx> +#include <unotxvw.hxx> +#include <poolfmt.hxx> +#include <globdoc.hxx> +#include <viewopt.hxx> +#include <unochart.hxx> +#include <charatr.hxx> +#include <svx/xmleohlp.hxx> +#include <globals.hrc> +#include <unomid.h> +#include <unotools/printwarningoptions.hxx> +#include <com/sun/star/util/SearchOptions.hpp> +#include <com/sun/star/lang/ServiceNotRegisteredException.hpp> +#include <com/sun/star/lang/DisposedException.hpp> +#include <com/sun/star/util/XNumberFormatsSupplier.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include <com/sun/star/beans/XFastPropertySet.hpp> +#include <com/sun/star/document/RedlineDisplayType.hpp> +#include <com/sun/star/document/XDocumentEventBroadcaster.hpp> +#include <com/sun/star/frame/XController.hpp> +#include <com/sun/star/frame/XFrame.hpp> +#include <com/sun/star/script/XInvocation.hpp> +#include <sfx2/linkmgr.hxx> +#include <svx/unofill.hxx> +#include <editeng/unolingu.hxx> +#include <sfx2/progress.hxx> +#include <swmodule.hxx> +#include <docstat.hxx> +#include <modcfg.hxx> +#include <ndtxt.hxx> +#include <utlui.hrc> +#include <swcont.hxx> +#include <unodefaults.hxx> +#include <SwXDocumentSettings.hxx> +#include <doc.hxx> +#include <editeng/forbiddencharacterstable.hxx> +#include <svl/zforlist.hxx> +#include <drawdoc.hxx> +#include <SwStyleNameMapper.hxx> +#include <osl/file.hxx> +#include <comphelper/storagehelper.hxx> +#include <cppuhelper/supportsservice.hxx> + +#include <EnhancedPDFExportHelper.hxx> +#include <numrule.hxx> + +#include <editeng/langitem.hxx> +#include <docary.hxx> +#include <i18nlangtag/languagetag.hxx> + +#include <format.hxx> +#include <charfmt.hxx> +#include <fmtcol.hxx> +#include <istyleaccess.hxx> + +#include <svl/stylepool.hxx> +#include <swatrset.hxx> +#include <view.hxx> +#include <srcview.hxx> + +#include <svtools/langtab.hxx> +#include <map> +#include <set> +#include <vector> + +#include <editeng/eeitem.hxx> +#include <editeng/editeng.hxx> +#include <svx/svdoutl.hxx> +#include <svl/languageoptions.hxx> +#include <svx/svdview.hxx> +#include <comphelper/processfactory.hxx> +#include <comphelper/servicehelper.hxx> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::i18n; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using ::osl::FileBase; + +#define SW_CREATE_DASH_TABLE 0x01 +#define SW_CREATE_GRADIENT_TABLE 0x02 +#define SW_CREATE_HATCH_TABLE 0x03 +#define SW_CREATE_BITMAP_TABLE 0x04 +#define SW_CREATE_TRANSGRADIENT_TABLE 0x05 +#define SW_CREATE_MARKER_TABLE 0x06 +#define SW_CREATE_DRAW_DEFAULTS 0x07 + +static SwPrintUIOptions * lcl_GetPrintUIOptions( + SwDocShell * pDocShell, + const SfxViewShell * pView ) +{ + if (!pDocShell) + return NULL; + + const bool bWebDoc = NULL != dynamic_cast< const SwWebDocShell * >(pDocShell); + const bool bSwSrcView = NULL != dynamic_cast< const SwSrcView * >(pView); + const SwView * pSwView = dynamic_cast< const SwView * >(pView); + const bool bHasSelection = pSwView && pSwView->HasSelection( false ); // check for any selection, not just text selection + const bool bHasPostIts = sw_GetPostIts( pDocShell->GetDoc(), 0 ); + + // get default values to use in dialog from documents SwPrintData + const SwPrintData &rPrintData = pDocShell->GetDoc()->getPrintData(); + + // Get current page number + sal_uInt16 nCurrentPage = 1; + SwWrtShell* pSh = pDocShell->GetWrtShell(); + if (pSh) + { + SwPaM* pShellCrsr = pSh->GetCrsr(); + nCurrentPage = pShellCrsr->GetPageNum(true, 0); + } + else if (!bSwSrcView) + { + const SwPagePreview* pPreview = dynamic_cast< const SwPagePreview* >(pView); + OSL_ENSURE(pPreview, "Unexpected type of the view shell"); + if (pPreview) + nCurrentPage = pPreview->GetSelectedPage(); + } + return new SwPrintUIOptions( nCurrentPage, bWebDoc, bSwSrcView, bHasSelection, bHasPostIts, rPrintData ); +} + +static SwTxtFmtColl *lcl_GetParaStyle(const OUString& rCollName, SwDoc* pDoc) +{ + SwTxtFmtColl* pColl = pDoc->FindTxtFmtCollByName( rCollName ); + if( !pColl ) + { + sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCollName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); + if( USHRT_MAX != nId ) + pColl = pDoc->GetTxtCollFromPool( nId ); + } + return pColl; +} + +static void lcl_DisposeView( SfxViewFrame* pToClose, SwDocShell* pDocShell ) +{ + // check if the view frame still exists + SfxViewFrame* pFound = SfxViewFrame::GetFirst( pDocShell, false ); + while(pFound) + { + if( pFound == pToClose) + { + pToClose->DoClose(); + break; + } + pFound = SfxViewFrame::GetNext( *pFound, pDocShell, false ); + } +} + +class SwXTextDocument::Impl +{ +private: + ::osl::Mutex m_Mutex; // just for OInterfaceContainerHelper + +public: + ::cppu::OInterfaceContainerHelper m_RefreshListeners; + + Impl() : m_RefreshListeners(m_Mutex) { } + +}; + +namespace +{ + class theSwXTextDocumentUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXTextDocumentUnoTunnelId > {}; +} + +const Sequence< sal_Int8 > & SwXTextDocument::getUnoTunnelId() +{ + return theSwXTextDocumentUnoTunnelId::get().getSeq(); +} + +sal_Int64 SAL_CALL SwXTextDocument::getSomething( const Sequence< sal_Int8 >& rId ) + throw(RuntimeException, std::exception) +{ + if( rId.getLength() == 16 + && 0 == memcmp( getUnoTunnelId().getConstArray(), + rId.getConstArray(), 16 ) ) + { + return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >( this )); + } + if( rId.getLength() == 16 + && 0 == memcmp( SfxObjectShell::getUnoTunnelId().getConstArray(), + rId.getConstArray(), 16 ) ) + { + return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(pDocShell )); + } + + sal_Int64 nRet = SfxBaseModel::getSomething( rId ); + if ( nRet ) + return nRet; + else + { + GetNumberFormatter(); + Any aNumTunnel = xNumFmtAgg->queryAggregation(cppu::UnoType<XUnoTunnel>::get()); + Reference<XUnoTunnel> xNumTunnel; + aNumTunnel >>= xNumTunnel; + if(xNumTunnel.is()) + return xNumTunnel->getSomething(rId); + } + + return SfxBaseModel::getSomething( rId ); +} + +Any SAL_CALL SwXTextDocument::queryInterface( const uno::Type& rType ) throw(RuntimeException, std::exception) +{ + Any aRet = SwXTextDocumentBaseClass::queryInterface(rType); + if ( !aRet.hasValue() ) + aRet = SfxBaseModel::queryInterface(rType); + if ( !aRet.hasValue() && + rType == cppu::UnoType<lang::XMultiServiceFactory>::get()) + { + Reference<lang::XMultiServiceFactory> xTmp = this; + aRet <<= xTmp; + } + + if ( !aRet.hasValue() + && rType != cppu::UnoType<com::sun::star::document::XDocumentEventBroadcaster>::get() + && rType != cppu::UnoType<com::sun::star::frame::XController>::get() + && rType != cppu::UnoType<com::sun::star::frame::XFrame>::get() + && rType != cppu::UnoType<com::sun::star::script::XInvocation>::get() + && rType != cppu::UnoType<com::sun::star::beans::XFastPropertySet>::get() + && rType != cppu::UnoType<com::sun::star::awt::XWindow>::get()) + { + GetNumberFormatter(); + if(xNumFmtAgg.is()) + aRet = xNumFmtAgg->queryAggregation(rType); + } + return aRet; +} + +void SAL_CALL SwXTextDocument::acquire()throw() +{ + SfxBaseModel::acquire(); +} + +void SAL_CALL SwXTextDocument::release()throw() +{ + SfxBaseModel::release(); +} + +Reference< XAdapter > SwXTextDocument::queryAdapter( ) throw(RuntimeException, std::exception) +{ + return SfxBaseModel::queryAdapter(); +} + +Sequence< uno::Type > SAL_CALL SwXTextDocument::getTypes() throw(RuntimeException, std::exception) +{ + Sequence< uno::Type > aBaseTypes = SfxBaseModel::getTypes(); + Sequence< uno::Type > aTextTypes = SwXTextDocumentBaseClass::getTypes(); + + Sequence< uno::Type > aNumTypes; + GetNumberFormatter(); + if(xNumFmtAgg.is()) + { + const uno::Type& rProvType = cppu::UnoType<XTypeProvider>::get(); + Any aNumProv = xNumFmtAgg->queryAggregation(rProvType); + Reference<XTypeProvider> xNumProv; + if(aNumProv >>= xNumProv) + { + aNumTypes = xNumProv->getTypes(); + } + } + long nIndex = aBaseTypes.getLength(); + // don't forget the lang::XMultiServiceFactory + aBaseTypes.realloc(aBaseTypes.getLength() + aTextTypes.getLength() + aNumTypes.getLength() + 1); + uno::Type* pBaseTypes = aBaseTypes.getArray(); + const uno::Type* pTextTypes = aTextTypes.getConstArray(); + long nPos; + for(nPos = 0; nPos < aTextTypes.getLength(); nPos++) + { + pBaseTypes[nIndex++] = pTextTypes[nPos]; + } + const uno::Type* pNumTypes = aNumTypes.getConstArray(); + for(nPos = 0; nPos < aNumTypes.getLength(); nPos++) + { + pBaseTypes[nIndex++] = pNumTypes[nPos]; + } + pBaseTypes[nIndex++] = cppu::UnoType<lang::XMultiServiceFactory>::get(); + return aBaseTypes; +} + +SwXTextDocument::SwXTextDocument(SwDocShell* pShell) + : SfxBaseModel(pShell) + , m_pImpl(new Impl) + , + pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_DOCUMENT)), + + pDocShell(pShell), + + bObjectValid(pShell != 0), + + pDrawPage(0), + pxXDrawPage(0), + pBodyText(0), + pxXNumberingRules(0), + pxXFootnotes(0), + pxXFootnoteSettings(0), + pxXEndnotes(0), + pxXEndnoteSettings(0), + pxXReferenceMarks(0), + pxXTextFieldTypes(0), + pxXTextFieldMasters(0), + pxXTextSections(0), + pxXBookmarks(0), + pxXTextTables(0), + pxXTextFrames(0), + pxXGraphicObjects(0), + pxXEmbeddedObjects(0), + pxXStyleFamilies(0), + pxXAutoStyles(0), + pxXChapterNumbering(0), + pxXDocumentIndexes(0), + + pxXLineNumberingProperties(0), + pxLinkTargetSupplier(0), + pxXRedlines(0), + m_pHiddenViewFrame(0), + pPropertyHelper(0), + m_pPrintUIOptions( NULL ), + m_pRenderData( NULL ), + // #i117783# + bApplyPagePrintSettingsFromXPagePrintable( false ) +{ +} + +SwXTextDocument::~SwXTextDocument() +{ + InitNewDoc(); + if(xNumFmtAgg.is()) + { + Reference< XInterface > x0; + xNumFmtAgg->setDelegator(x0); + xNumFmtAgg = 0; + } + delete m_pPrintUIOptions; + if (m_pRenderData && m_pRenderData->IsViewOptionAdjust()) + { // rhbz#827695: this can happen if the last page is not printed + // the SwViewShell has been deleted already by SwView::~SwView + // FIXME: replace this awful implementation of XRenderable with + // something less insane that has its own view + m_pRenderData->ViewOptionAdjustCrashPreventionKludge(); + } + delete m_pRenderData; +} + +SwXDocumentPropertyHelper * SwXTextDocument::GetPropertyHelper () +{ + if(!xPropertyHelper.is()) + { + pPropertyHelper = new SwXDocumentPropertyHelper(*pDocShell->GetDoc()); + xPropertyHelper = (cppu::OWeakObject*)pPropertyHelper; + } + return pPropertyHelper; +} + +void SwXTextDocument::GetNumberFormatter() +{ + if(IsValid()) + { + if(!xNumFmtAgg.is()) + { + if ( pDocShell->GetDoc() ) + { + SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj( + pDocShell->GetDoc()->GetNumberFormatter( true )); + Reference< util::XNumberFormatsSupplier > xTmp = pNumFmt; + xNumFmtAgg = Reference< XAggregation >(xTmp, UNO_QUERY); + } + if(xNumFmtAgg.is()) + xNumFmtAgg->setDelegator((cppu::OWeakObject*)(SwXTextDocumentBaseClass*)this); + } + else + { + const uno::Type& rTunnelType = cppu::UnoType<XUnoTunnel>::get(); + Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType); + SvNumberFormatsSupplierObj* pNumFmt = 0; + Reference< XUnoTunnel > xNumTunnel; + if(aNumTunnel >>= xNumTunnel) + { + pNumFmt = reinterpret_cast<SvNumberFormatsSupplierObj*>( + xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId())); + + } + OSL_ENSURE(pNumFmt, "No number formatter available"); + if (pNumFmt && !pNumFmt->GetNumberFormatter()) + pNumFmt->SetNumberFormatter(pDocShell->GetDoc()->GetNumberFormatter( true )); + } + } +} + +Reference< XText > SwXTextDocument::getText(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!xBodyText.is()) + { + pBodyText = new SwXBodyText(pDocShell->GetDoc()); + xBodyText = pBodyText; + } + return xBodyText; +} + +void SwXTextDocument::reformat(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); +} + +void SwXTextDocument::lockControllers(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(IsValid()) + { + UnoActionContext* pContext = new UnoActionContext(pDocShell->GetDoc()); + aActionArr.push_front(pContext); + } + else + throw RuntimeException(); +} + +void SwXTextDocument::unlockControllers(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!aActionArr.empty()) + { + UnoActionContext* pContext = aActionArr.front(); + aActionArr.pop_front(); + delete pContext; + } + else + throw RuntimeException(); +} + +sal_Bool SwXTextDocument::hasControllersLocked(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + return !aActionArr.empty(); +} + +Reference< frame::XController > SwXTextDocument::getCurrentController(void) throw( RuntimeException, std::exception ) +{ + return SfxBaseModel::getCurrentController(); +} + +void SwXTextDocument::setCurrentController(const Reference< frame::XController > & xController) + throw( NoSuchElementException, RuntimeException, std::exception ) +{ + SfxBaseModel::setCurrentController(xController); +} + +Reference< XInterface > SwXTextDocument::getCurrentSelection() throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< XInterface > xRef; + if(IsValid()) + { + + const TypeId aTypeId = TYPE(SwView); + SwView* pView = (SwView*)SfxViewShell::GetFirst(&aTypeId); + while(pView && pView->GetObjectShell() != pDocShell) + { + pView = (SwView*)SfxViewShell::GetNext(*pView, &aTypeId); + } + if(pView) + { + Any aRef = pView->GetUNOObject()->getSelection(); + aRef >>= xRef; + } + } + return xRef; +} + +sal_Bool SwXTextDocument::attachResource(const OUString& aURL, const Sequence< beans::PropertyValue >& aArgs) + throw( RuntimeException, std::exception ) +{ + return SfxBaseModel::attachResource(aURL, aArgs); +} + +OUString SwXTextDocument::getURL(void) throw( RuntimeException, std::exception ) +{ + return SfxBaseModel::getURL(); +} + +Sequence< beans::PropertyValue > SwXTextDocument::getArgs(void) throw( RuntimeException, std::exception ) +{ + return SfxBaseModel::getArgs(); +} + +void SwXTextDocument::connectController(const Reference< frame::XController > & xController) throw( RuntimeException, std::exception ) +{ + SfxBaseModel::connectController(xController); +} + +void SwXTextDocument::disconnectController(const Reference< frame::XController > & xController) throw( RuntimeException, std::exception ) +{ + SfxBaseModel::disconnectController(xController); +} + +void SwXTextDocument::dispose(void) throw( RuntimeException, std::exception ) +{ + SfxBaseModel::dispose(); +} + +void SwXTextDocument::close( sal_Bool bDeliverOwnership ) throw( util::CloseVetoException, RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(IsValid() && m_pHiddenViewFrame) + lcl_DisposeView( m_pHiddenViewFrame, pDocShell); + SfxBaseModel::close(bDeliverOwnership); +} + +void SwXTextDocument::addEventListener(const Reference< lang::XEventListener > & aListener) throw( RuntimeException, std::exception ) +{ + SfxBaseModel::addEventListener(aListener); +} + +void SwXTextDocument::removeEventListener(const Reference< lang::XEventListener > & aListener) throw( RuntimeException, std::exception ) +{ + SfxBaseModel::removeEventListener(aListener); +} + +Reference< XPropertySet > SwXTextDocument::getLineNumberingProperties(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(IsValid()) + { + if(!pxXLineNumberingProperties) + { + pxXLineNumberingProperties = new Reference<XPropertySet>; + (*pxXLineNumberingProperties) = new SwXLineNumberingProperties(pDocShell->GetDoc()); + } + } + else + throw RuntimeException(); + return *pxXLineNumberingProperties; +} + +Reference< XIndexReplace > SwXTextDocument::getChapterNumberingRules(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXChapterNumbering) + { + pxXChapterNumbering = new Reference< XIndexReplace > ; + *pxXChapterNumbering = new SwXChapterNumbering(*pDocShell); + } + return *pxXChapterNumbering; +} + +Reference< XIndexAccess > SwXTextDocument::getNumberingRules(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXNumberingRules ) + { + ((SwXTextDocument*)this)->pxXNumberingRules = new Reference< XIndexAccess > ; + *pxXNumberingRules = new SwXNumberingRulesCollection( pDocShell->GetDoc() ); + } + return *pxXNumberingRules; +} + +Reference< XIndexAccess > SwXTextDocument::getFootnotes(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXFootnotes) + { + ((SwXTextDocument*)this)->pxXFootnotes = new Reference< XIndexAccess > ; + *pxXFootnotes = new SwXFootnotes(false, pDocShell->GetDoc()); + } + return *pxXFootnotes; +} + +Reference< XPropertySet > SAL_CALL + SwXTextDocument::getFootnoteSettings(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXFootnoteSettings) + { + ((SwXTextDocument*)this)->pxXFootnoteSettings = new Reference< XPropertySet > ; + *pxXFootnoteSettings = new SwXFootnoteProperties(pDocShell->GetDoc()); + } + return *pxXFootnoteSettings; +} + +Reference< XIndexAccess > SwXTextDocument::getEndnotes(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXEndnotes) + { + ((SwXTextDocument*)this)->pxXEndnotes = new Reference< XIndexAccess > ; + *pxXEndnotes = new SwXFootnotes(true, pDocShell->GetDoc()); + } + return *pxXEndnotes; +} + +Reference< XPropertySet > SwXTextDocument::getEndnoteSettings(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXEndnoteSettings) + { + ((SwXTextDocument*)this)->pxXEndnoteSettings = new Reference< XPropertySet > ; + *pxXEndnoteSettings = new SwXEndnoteProperties(pDocShell->GetDoc()); + } + return *pxXEndnoteSettings; +} + +Reference< util::XReplaceDescriptor > SwXTextDocument::createReplaceDescriptor(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< util::XReplaceDescriptor > xRet = new SwXTextSearch; + return xRet; +} + +SwUnoCrsr* SwXTextDocument::CreateCursorForSearch(Reference< XTextCursor > & xCrsr) +{ + getText(); + XText *const pText = xBodyText.get(); + SwXBodyText* pBText = (SwXBodyText*)pText; + SwXTextCursor *const pXTextCursor = pBText->CreateTextCursor(true); + xCrsr.set( static_cast<text::XWordCursor*>(pXTextCursor) ); + + SwUnoCrsr *const pUnoCrsr = pXTextCursor->GetCursor(); + pUnoCrsr->SetRemainInSection(false); + return pUnoCrsr; +} + +sal_Int32 SwXTextDocument::replaceAll(const Reference< util::XSearchDescriptor > & xDesc) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< XUnoTunnel > xDescTunnel(xDesc, UNO_QUERY); + if(!IsValid() || !xDescTunnel.is() || !xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())) + throw RuntimeException(); + + Reference< XTextCursor > xCrsr; + SwUnoCrsr* pUnoCrsr = CreateCursorForSearch(xCrsr); + + const SwXTextSearch* pSearch = reinterpret_cast<const SwXTextSearch*>( + xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())); + + int eRanges(FND_IN_BODY|FND_IN_SELALL); + + util::SearchOptions aSearchOpt; + pSearch->FillSearchOptions( aSearchOpt ); + + SwDocPositions eStart = pSearch->bBack ? DOCPOS_END : DOCPOS_START; + SwDocPositions eEnd = pSearch->bBack ? DOCPOS_START : DOCPOS_END; + + // Search should take place anywhere + pUnoCrsr->SetRemainInSection(false); + sal_uInt32 nResult; + UnoActionContext aContext(pDocShell->GetDoc()); + //try attribute search first + if(pSearch->HasSearchAttributes()||pSearch->HasReplaceAttributes()) + { + SfxItemSet aSearch(pDocShell->GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_CHRATR_END-1, + RES_PARATR_BEGIN, RES_PARATR_END-1, + RES_FRMATR_BEGIN, RES_FRMATR_END-1, + 0); + SfxItemSet aReplace(pDocShell->GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_CHRATR_END-1, + RES_PARATR_BEGIN, RES_PARATR_END-1, + RES_FRMATR_BEGIN, RES_FRMATR_END-1, + 0); + pSearch->FillSearchItemSet(aSearch); + pSearch->FillReplaceItemSet(aReplace); + bool bCancel; + nResult = (sal_Int32)pUnoCrsr->Find( aSearch, !pSearch->bStyles, + eStart, eEnd, bCancel, + (FindRanges)eRanges, + !pSearch->sSearchText.isEmpty() ? &aSearchOpt : 0, + &aReplace ); + } + else if(pSearch->bStyles) + { + SwTxtFmtColl *pSearchColl = lcl_GetParaStyle(pSearch->sSearchText, pUnoCrsr->GetDoc()); + SwTxtFmtColl *pReplaceColl = lcl_GetParaStyle(pSearch->sReplaceText, pUnoCrsr->GetDoc()); + + bool bCancel; + nResult = pUnoCrsr->Find( *pSearchColl, + eStart, eEnd, bCancel, + (FindRanges)eRanges, pReplaceColl ); + + } + else + { + //todo/mba: assuming that notes should be omitted + bool bSearchInNotes = false; + bool bCancel; + nResult = pUnoCrsr->Find( aSearchOpt, bSearchInNotes, + eStart, eEnd, bCancel, + (FindRanges)eRanges, + true ); + } + return (sal_Int32)nResult; + +} + +Reference< util::XSearchDescriptor > SwXTextDocument::createSearchDescriptor(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< util::XSearchDescriptor > xRet = new SwXTextSearch; + return xRet; + +} + +// Used for findAll/First/Next + +SwUnoCrsr* SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc, + Reference< XTextCursor > & xCrsr, + bool bAll, + sal_Int32& nResult, + Reference< XInterface > xLastResult) +{ + Reference< XUnoTunnel > xDescTunnel(xDesc, UNO_QUERY); + if(!IsValid() || !xDescTunnel.is() || !xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())) + return 0; + + SwUnoCrsr* pUnoCrsr = CreateCursorForSearch(xCrsr); + const SwXTextSearch* pSearch = reinterpret_cast<const SwXTextSearch*>( + xDescTunnel->getSomething(SwXTextSearch::getUnoTunnelId())); + + bool bParentInExtra = false; + if(xLastResult.is()) + { + Reference<XUnoTunnel> xCursorTunnel( xLastResult, UNO_QUERY); + OTextCursorHelper* pPosCrsr = 0; + if(xCursorTunnel.is()) + { + pPosCrsr = reinterpret_cast<OTextCursorHelper*>(xCursorTunnel->getSomething( + OTextCursorHelper::getUnoTunnelId())); + } + SwPaM* pCrsr = pPosCrsr ? pPosCrsr->GetPaM() : 0; + if(pCrsr) + { + *pUnoCrsr->GetPoint() = *pCrsr->End(); + pUnoCrsr->DeleteMark(); + } + else + { + SwXTextRange* pRange = 0; + if(xCursorTunnel.is()) + { + pRange = reinterpret_cast<SwXTextRange*>(xCursorTunnel->getSomething( + SwXTextRange::getUnoTunnelId())); + } + if(!pRange) + return 0; + pRange->GetPositions(*pUnoCrsr); + if(pUnoCrsr->HasMark()) + { + if(*pUnoCrsr->GetPoint() < *pUnoCrsr->GetMark()) + pUnoCrsr->Exchange(); + pUnoCrsr->DeleteMark(); + } + } + const SwNode* pRangeNode = pUnoCrsr->GetNode(); + bParentInExtra = pRangeNode->FindFlyStartNode() || + pRangeNode->FindFootnoteStartNode() || + pRangeNode->FindHeaderStartNode() || + pRangeNode->FindFooterStartNode() ; + } + + util::SearchOptions aSearchOpt; + pSearch->FillSearchOptions( aSearchOpt ); + +/** + * The following combinations are allowed: + * - Search in the body: -> FND_IN_BODY + * - Search all in the body: -> FND_IN_BODYONLY | FND_IN_SELALL + * - Search in selections: one / all -> FND_IN_SEL [ | FND_IN_SELALL ] + * - Search outside the body: one / all -> FND_IN_OTHER [ | FND_IN_SELALL ] + * - Search everywhere all: -> FND_IN_SELALL + */ + int eRanges(FND_IN_BODY); + if(bParentInExtra) + eRanges = FND_IN_OTHER; + if(bAll) //always - everywhere? + eRanges = FND_IN_SELALL; + SwDocPositions eStart = !bAll ? DOCPOS_CURR : pSearch->bBack ? DOCPOS_END : DOCPOS_START; + SwDocPositions eEnd = pSearch->bBack ? DOCPOS_START : DOCPOS_END; + + nResult = 0; + sal_uInt16 nSearchProc = 0; + while(nSearchProc < 2) + { + //try attribute search first + if(pSearch->HasSearchAttributes()) + { + SfxItemSet aSearch(pDocShell->GetDoc()->GetAttrPool(), + RES_CHRATR_BEGIN, RES_CHRATR_END-1, + RES_PARATR_BEGIN, RES_PARATR_END-1, + RES_FRMATR_BEGIN, RES_FRMATR_END-1, + RES_TXTATR_INETFMT, RES_TXTATR_CHARFMT, + 0); + pSearch->FillSearchItemSet(aSearch); + bool bCancel; + nResult = (sal_Int32)pUnoCrsr->Find( aSearch, !pSearch->bStyles, + eStart, eEnd, bCancel, + (FindRanges)eRanges, + !pSearch->sSearchText.isEmpty() ? &aSearchOpt : 0, + 0 ); + } + else if(pSearch->bStyles) + { + SwTxtFmtColl *pSearchColl = lcl_GetParaStyle(pSearch->sSearchText, pUnoCrsr->GetDoc()); + //pSearch->sReplaceText + SwTxtFmtColl *pReplaceColl = 0; + bool bCancel; + nResult = (sal_Int32)pUnoCrsr->Find( *pSearchColl, + eStart, eEnd, bCancel, + (FindRanges)eRanges, pReplaceColl ); + } + else + { + //todo/mba: assuming that notes should be omitted + bool bSearchInNotes = false; + bool bCancel; + nResult = (sal_Int32)pUnoCrsr->Find( aSearchOpt, bSearchInNotes, + eStart, eEnd, bCancel, + (FindRanges)eRanges, + /*bool bReplace =*/false ); + } + nSearchProc++; + if(nResult || (eRanges&(FND_IN_SELALL|FND_IN_OTHER))) + break; + //second step - find in other + eRanges = FND_IN_OTHER; + } + return pUnoCrsr; +} + +Reference< XIndexAccess > + SwXTextDocument::findAll(const Reference< util::XSearchDescriptor > & xDesc) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< XInterface > xTmp; + sal_Int32 nResult = 0; + Reference< XTextCursor > xCrsr; + SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, true, nResult, xTmp); + if(!pResultCrsr) + throw RuntimeException(); + Reference< XIndexAccess > xRet; + xRet = new SwXTextRanges( (nResult) ? pResultCrsr : 0 ); + delete pResultCrsr; + return xRet; +} + +Reference< XInterface > SwXTextDocument::findFirst(const Reference< util::XSearchDescriptor > & xDesc) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< XInterface > xTmp; + sal_Int32 nResult = 0; + Reference< XTextCursor > xCrsr; + SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, false, nResult, xTmp); + if(!pResultCrsr) + throw RuntimeException(); + Reference< XInterface > xRet; + if(nResult) + { + const uno::Reference< text::XText > xParent = + ::sw::CreateParentXText(*pDocShell->GetDoc(), + *pResultCrsr->GetPoint()); + xRet = *new SwXTextCursor(xParent, *pResultCrsr); + delete pResultCrsr; + } + return xRet; +} + +Reference< XInterface > SwXTextDocument::findNext(const Reference< XInterface > & xStartAt, + const Reference< util::XSearchDescriptor > & xDesc) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Reference< XInterface > xTmp; + sal_Int32 nResult = 0; + Reference< XTextCursor > xCrsr; + if(!xStartAt.is()) + throw RuntimeException(); + SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, false, nResult, xStartAt); + if(!pResultCrsr) + throw RuntimeException(); + Reference< XInterface > xRet; + if(nResult) + { + const uno::Reference< text::XText > xParent = + ::sw::CreateParentXText(*pDocShell->GetDoc(), + *pResultCrsr->GetPoint()); + + xRet = *new SwXTextCursor(xParent, *pResultCrsr); + delete pResultCrsr; + } + return xRet; +} + +Sequence< beans::PropertyValue > SwXTextDocument::getPagePrintSettings(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + Sequence< beans::PropertyValue > aSeq(9); + if(IsValid()) + { + beans::PropertyValue* pArray = aSeq.getArray(); + SwPagePreviewPrtData aData; + const SwPagePreviewPrtData* pData = pDocShell->GetDoc()->GetPreviewPrtData(); + if(pData) + aData = *pData; + Any aVal; + aVal <<= (sal_Int16)aData.GetRow(); + pArray[0] = beans::PropertyValue("PageRows", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int16)aData.GetCol(); + pArray[1] = beans::PropertyValue("PageColumns", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int32)convertTwipToMm100(aData.GetLeftSpace()); + pArray[2] = beans::PropertyValue("LeftMargin", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int32)convertTwipToMm100(aData.GetRightSpace()); + pArray[3] = beans::PropertyValue("RightMargin", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int32)convertTwipToMm100(aData.GetTopSpace()); + pArray[4] = beans::PropertyValue("TopMargin", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int32)convertTwipToMm100(aData.GetBottomSpace()); + pArray[5] = beans::PropertyValue("BottomMargin", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int32)convertTwipToMm100(aData.GetHorzSpace()); + pArray[6] = beans::PropertyValue("HoriMargin", -1, aVal, PropertyState_DIRECT_VALUE); + aVal <<= (sal_Int32)convertTwipToMm100(aData.GetVertSpace()); + pArray[7] = beans::PropertyValue("VertMargin", -1, aVal, PropertyState_DIRECT_VALUE); + sal_Bool bTemp = aData.GetLandscape(); + aVal.setValue(&bTemp, ::getCppuBooleanType()); + pArray[8] = beans::PropertyValue("IsLandscape", -1, aVal, PropertyState_DIRECT_VALUE); + } + else + throw RuntimeException(); + return aSeq; +} + +static sal_uInt32 lcl_Any_To_ULONG(const Any& rValue, bool& bException) +{ + bException = false; + TypeClass eType = rValue.getValueType().getTypeClass(); + + sal_uInt32 nRet = 0; + if( eType == TypeClass_UNSIGNED_LONG ) + rValue >>= nRet; + else + { + sal_Int32 nVal=0; + bException = !(rValue >>= nVal); + if( !bException ) + nRet = (sal_uInt32)nVal; + } + + return nRet; +} + +static OUString lcl_CreateOutlineString( sal_uInt16 nIndex, + const SwOutlineNodes& rOutlineNodes, const SwNumRule* pOutlRule) +{ + OUString sEntry; + const SwTxtNode * pTxtNd = rOutlineNodes[ nIndex ]->GetTxtNode(); + SwNumberTree::tNumberVector aNumVector = pTxtNd->GetNumberVector(); + if( pOutlRule && pTxtNd->GetNumRule()) + for( sal_Int8 nLevel = 0; + nLevel <= pTxtNd->GetActualListLevel(); + nLevel++ ) + { + long nVal = aNumVector[nLevel]; + nVal ++; + nVal -= pOutlRule->Get(nLevel).GetStart(); + sEntry += OUString::number( nVal ); + sEntry += "."; + } + sEntry += rOutlineNodes[ nIndex ]-> + GetTxtNode()->GetExpandTxt( 0, -1, false ); + return sEntry; +} + +void SwXTextDocument::setPagePrintSettings(const Sequence< beans::PropertyValue >& aSettings) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(IsValid()) + { + SwPagePreviewPrtData aData; + //if only a few properties are coming, then use the current settings + const SwPagePreviewPrtData* pData = pDocShell->GetDoc()->GetPreviewPrtData(); + if(pData) + aData = *pData; + const beans::PropertyValue* pProperties = aSettings.getConstArray(); + int nCount = aSettings.getLength(); + for(int i = 0; i < nCount; i++) + { + OUString sName = pProperties[i].Name; + const Any& rVal = pProperties[i].Value; + bool bException; + sal_uInt32 nVal = lcl_Any_To_ULONG(rVal, bException); + if( sName.equalsAscii("PageRows" ) ) + { + if(!nVal || nVal > 0xff) + throw RuntimeException(); + aData.SetRow((sal_uInt8)nVal); + } + else if(sName.equalsAscii("PageColumns")) + { + if(!nVal || nVal > 0xff) + throw RuntimeException(); + aData.SetCol((sal_uInt8)nVal); + } + else if(sName.equalsAscii("LeftMargin")) + { + aData.SetLeftSpace(convertMm100ToTwip(nVal)); + } + else if(sName.equalsAscii("RightMargin")) + { + aData.SetRightSpace(convertMm100ToTwip(nVal)); + } + else if(sName.equalsAscii("TopMargin")) + { + aData.SetTopSpace(convertMm100ToTwip(nVal)); + } + else if(sName.equalsAscii("BottomMargin")) + { + aData.SetBottomSpace(convertMm100ToTwip(nVal)); + } + else if(sName.equalsAscii("HoriMargin")) + { + aData.SetHorzSpace(convertMm100ToTwip(nVal)); + } + else if(sName.equalsAscii("VertMargin")) + { + aData.SetVertSpace(convertMm100ToTwip(nVal)); + } + else if(sName.equalsAscii("IsLandscape")) + { + bException = (::getBooleanCppuType() != rVal.getValueType()); + aData.SetLandscape(*(sal_Bool*)rVal.getValue()); + } + else + bException = true; + if(bException) + throw RuntimeException(); + } + pDocShell->GetDoc()->SetPreviewPrtData(&aData); + } + else + throw RuntimeException(); +} + +void SwXTextDocument::printPages(const Sequence< beans::PropertyValue >& xOptions) + throw( IllegalArgumentException, RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(IsValid()) + { + SfxViewFrame* pFrame = SfxViewFrame::LoadHiddenDocument( *pDocShell, 7 ); + SfxRequest aReq(FN_PRINT_PAGEPREVIEW, SFX_CALLMODE_SYNCHRON, + pDocShell->GetDoc()->GetAttrPool()); + aReq.AppendItem(SfxBoolItem(FN_PRINT_PAGEPREVIEW, true)); + + for ( int n = 0; n < xOptions.getLength(); ++n ) + { + // get Property-Value from options + const beans::PropertyValue &rProp = xOptions.getConstArray()[n]; + Any aValue( rProp.Value ); + + // FileName-Property? + if ( rProp.Name == UNO_NAME_FILE_NAME ) + { + OUString sFileURL; + if ( (rProp.Value >>= sFileURL ) ) + { + // Convert the File URL into a system dependent path, as the SalPrinter expects + OUString sSystemPath; + FileBase::getSystemPathFromFileURL ( sFileURL, sSystemPath ); + aReq.AppendItem(SfxStringItem( SID_FILE_NAME, sSystemPath ) ); + } + else if ( rProp.Value.getValueType() != ::getVoidCppuType() ) + throw IllegalArgumentException(); + } + + // CopyCount-Property + else if ( rProp.Name == UNO_NAME_COPY_COUNT ) + { + sal_Int32 nCopies = 0; + aValue >>= nCopies; + aReq.AppendItem(SfxInt16Item( SID_PRINT_COPIES, (sal_Int16)nCopies ) ); + } + + // Collate-Property + else if ( rProp.Name == UNO_NAME_COLLATE ) + { + if ( rProp.Value.getValueType() == ::getBooleanCppuType()) + + aReq.AppendItem(SfxBoolItem( SID_PRINT_COLLATE, *(sal_Bool*)rProp.Value.getValue() ) ); + else + throw IllegalArgumentException(); + } + + // Sort-Property + else if ( rProp.Name == UNO_NAME_SORT ) + { + if ( rProp.Value.getValueType() == ::getBooleanCppuType() ) + aReq.AppendItem(SfxBoolItem( SID_PRINT_SORT, *(sal_Bool*)rProp.Value.getValue() ) ); + else + throw IllegalArgumentException(); + } + + // Pages-Property + else if ( rProp.Name == UNO_NAME_PAGES ) + { + OUString sTmp; + if ( rProp.Value >>= sTmp ) + aReq.AppendItem( SfxStringItem( SID_PRINT_PAGES, sTmp ) ); + else + throw IllegalArgumentException(); + } + } + + // #i117783# + bApplyPagePrintSettingsFromXPagePrintable = true; + pFrame->GetViewShell()->ExecuteSlot(aReq); + // Frame close + pFrame->DoClose(); + + } + else + throw RuntimeException(); +} + +Reference< XNameAccess > SwXTextDocument::getReferenceMarks(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXReferenceMarks) + { + ((SwXTextDocument*)this)->pxXReferenceMarks = new Reference< XNameAccess > ; + *pxXReferenceMarks = new SwXReferenceMarks(pDocShell->GetDoc()); + } + return *pxXReferenceMarks; +} + +Reference< XEnumerationAccess > SwXTextDocument::getTextFields(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXTextFieldTypes) + { + ((SwXTextDocument*)this)->pxXTextFieldTypes = new Reference< XEnumerationAccess > ; + *pxXTextFieldTypes = new SwXTextFieldTypes(pDocShell->GetDoc()); + } + return *pxXTextFieldTypes; +} + +Reference< XNameAccess > SwXTextDocument::getTextFieldMasters(void) + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXTextFieldMasters) + { + ((SwXTextDocument*)this)->pxXTextFieldMasters = new Reference< XNameAccess > ; + *pxXTextFieldMasters = new SwXTextFieldMasters(pDocShell->GetDoc()); + } + return *pxXTextFieldMasters; +} + +Reference< XNameAccess > SwXTextDocument::getEmbeddedObjects(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXEmbeddedObjects) + { + ((SwXTextDocument*)this)->pxXEmbeddedObjects = new Reference< XNameAccess > ; + *pxXEmbeddedObjects = new SwXTextEmbeddedObjects(pDocShell->GetDoc()); + } + return *pxXEmbeddedObjects; +} + +Reference< XNameAccess > SwXTextDocument::getBookmarks(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXBookmarks) + { + ((SwXTextDocument*)this)->pxXBookmarks = new Reference< XNameAccess > ; + *pxXBookmarks = new SwXBookmarks(pDocShell->GetDoc()); + } + return *pxXBookmarks; +} + +Reference< XNameAccess > SwXTextDocument::getTextSections(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXTextSections) + { + ((SwXTextDocument*)this)->pxXTextSections = new Reference< XNameAccess > ; + *pxXTextSections = new SwXTextSections(pDocShell->GetDoc()); + } + return *pxXTextSections; +} + +Reference< XNameAccess > SwXTextDocument::getTextTables(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXTextTables) + { + ((SwXTextDocument*)this)->pxXTextTables = new Reference< XNameAccess > ; + *pxXTextTables = new SwXTextTables(pDocShell->GetDoc()); + } + return *pxXTextTables; +} + +Reference< XNameAccess > SwXTextDocument::getGraphicObjects(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXGraphicObjects) + { + ((SwXTextDocument*)this)->pxXGraphicObjects = new Reference< XNameAccess > ; + *pxXGraphicObjects = new SwXTextGraphicObjects(pDocShell->GetDoc()); + } + return *pxXGraphicObjects; +} + +Reference< XNameAccess > SwXTextDocument::getTextFrames(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXTextFrames) + { + ((SwXTextDocument*)this)->pxXTextFrames = new Reference< XNameAccess > ; + *pxXTextFrames = new SwXTextFrames(pDocShell->GetDoc()); + } + return *pxXTextFrames; +} + +Reference< XNameAccess > SwXTextDocument::getStyleFamilies(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXStyleFamilies) + { + ((SwXTextDocument*)this)->pxXStyleFamilies = new Reference< XNameAccess > ; + *pxXStyleFamilies = new SwXStyleFamilies(*pDocShell); + } + return *pxXStyleFamilies; +} + +uno::Reference< style::XAutoStyles > SwXTextDocument::getAutoStyles( ) + throw (uno::RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXAutoStyles) + { + pxXAutoStyles = new Reference< style::XAutoStyles > ; + *pxXAutoStyles = new SwXAutoStyles(*pDocShell); + } + return *pxXAutoStyles; + +} + +Reference< drawing::XDrawPage > SwXTextDocument::getDrawPage(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXDrawPage) + { + ((SwXTextDocument*)this)->pDrawPage = new SwXDrawPage(pDocShell->GetDoc()); + ((SwXTextDocument*)this)->pxXDrawPage = new Reference< drawing::XDrawPage >(pDrawPage); + // Create a Reference to trigger the complete initialization of the + // object. Otherwise in some corner cases it would get initialized + // at ::InitNewDoc -> which would get called during + // close() or dispose() -> n#681746 + uno::Reference<lang::XComponent> xComp( *pxXDrawPage, uno::UNO_QUERY ); + } + return *pxXDrawPage; +} + +SwXDrawPage* SwXTextDocument::GetDrawPage() +{ + if(!IsValid()) + return 0; + if(!pDrawPage) + getDrawPage(); + return pDrawPage; +} + +void SwXTextDocument::Invalidate() +{ + bObjectValid = false; + if(xNumFmtAgg.is()) + { + const uno::Type& rTunnelType = cppu::UnoType<XUnoTunnel>::get(); + Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType); + SvNumberFormatsSupplierObj* pNumFmt = 0; + Reference< XUnoTunnel > xNumTunnel; + if(aNumTunnel >>= xNumTunnel) + { + pNumFmt = reinterpret_cast<SvNumberFormatsSupplierObj*>( + xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId())); + pNumFmt->SetNumberFormatter(0); + } + OSL_ENSURE(pNumFmt, "No number formatter available"); + } + InitNewDoc(); + pDocShell = 0; + lang::EventObject const ev(static_cast<SwXTextDocumentBaseClass &>(*this)); + m_pImpl->m_RefreshListeners.disposeAndClear(ev); +} + +void SwXTextDocument::Reactivate(SwDocShell* pNewDocShell) +{ + if(pDocShell && pDocShell != pNewDocShell) + Invalidate(); + pDocShell = pNewDocShell; + bObjectValid = true; +} + +void SwXTextDocument::InitNewDoc() +{ + // first invalidate all collections, then delete references and Set to zero + if(pxXTextTables) + { + XNameAccess* pTbls = pxXTextTables->get(); + ((SwXTextTables*)pTbls)->Invalidate(); + delete pxXTextTables; + pxXTextTables = 0; + } + + if(pxXTextFrames) + { + XNameAccess* pFrms = pxXTextFrames->get(); + ((SwXTextFrames*)pFrms)->Invalidate(); + delete pxXTextFrames; + pxXTextFrames = 0; + } + + if(pxXGraphicObjects) + { + XNameAccess* pFrms = pxXGraphicObjects->get(); + ((SwXTextGraphicObjects*)pFrms)->Invalidate(); + delete pxXGraphicObjects; + pxXGraphicObjects = 0; + } + + if(pxXEmbeddedObjects) + { + XNameAccess* pOLE = pxXEmbeddedObjects->get(); + ((SwXTextEmbeddedObjects*)pOLE)->Invalidate(); + delete pxXEmbeddedObjects; + pxXEmbeddedObjects = 0; + } + + if(xBodyText.is()) + { + xBodyText = 0; + pBodyText = 0; + } + + if(xNumFmtAgg.is()) + { + const uno::Type& rTunnelType = cppu::UnoType<XUnoTunnel>::get(); + Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType); + SvNumberFormatsSupplierObj* pNumFmt = 0; + Reference< XUnoTunnel > xNumTunnel; + if(aNumTunnel >>= xNumTunnel) + { + pNumFmt = reinterpret_cast<SvNumberFormatsSupplierObj*>( + xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId())); + + } + OSL_ENSURE(pNumFmt, "No number formatter available"); + if (pNumFmt) + pNumFmt->SetNumberFormatter(0); + } + + if(pxXTextFieldTypes) + { + XEnumerationAccess* pT = pxXTextFieldTypes->get(); + ((SwXTextFieldTypes*)pT)->Invalidate(); + delete pxXTextFieldTypes; + pxXTextFieldTypes = 0; + } + + if(pxXTextFieldMasters) + { + XNameAccess* pT = pxXTextFieldMasters->get(); + ((SwXTextFieldMasters*)pT)->Invalidate(); + delete pxXTextFieldMasters; + pxXTextFieldMasters = 0; + } + + if(pxXTextSections) + { + XNameAccess* pSect = pxXTextSections->get(); + ((SwXTextSections*)pSect)->Invalidate(); + delete pxXTextSections; + pxXTextSections = 0; + } + + if(pxXDrawPage) + { + // #i91798#, #i91895# + // dispose XDrawPage here. We are the owner and know that it is no longer in a valid condition. + uno::Reference<lang::XComponent> xComp( *pxXDrawPage, uno::UNO_QUERY ); + xComp->dispose(); + pDrawPage->InvalidateSwDoc(); + delete pxXDrawPage; + pxXDrawPage = 0; + } + + if ( pxXNumberingRules ) + { + XIndexAccess* pNum = pxXNumberingRules->get(); + ((SwXNumberingRulesCollection*)pNum)->Invalidate(); + delete pxXNumberingRules; + pxXNumberingRules = 0; + } + + if(pxXFootnotes) + { + XIndexAccess* pFtn = pxXFootnotes->get(); + ((SwXFootnotes*)pFtn)->Invalidate(); + delete pxXFootnotes; + pxXFootnotes = 0; + } + + if(pxXEndnotes) + { + XIndexAccess* pFtn = pxXEndnotes->get(); + ((SwXFootnotes*)pFtn)->Invalidate(); + delete pxXEndnotes; + pxXEndnotes = 0; + } + + if(pxXDocumentIndexes) + { + XIndexAccess* pIdxs = pxXDocumentIndexes->get(); + ((SwXDocumentIndexes*)pIdxs)->Invalidate(); + delete pxXDocumentIndexes; + pxXDocumentIndexes = 0; + } + + if(pxXStyleFamilies) + { + XNameAccess* pStyles = pxXStyleFamilies->get(); + ((SwXStyleFamilies*)pStyles)->Invalidate(); + delete pxXStyleFamilies; + pxXStyleFamilies = 0; + } + if(pxXAutoStyles) + { + XNameAccess* pStyles = pxXAutoStyles->get(); + ((SwXAutoStyles*)pStyles)->Invalidate(); + delete pxXAutoStyles; + pxXAutoStyles = 0; + } + + if(pxXBookmarks) + { + XNameAccess* pBm = pxXBookmarks->get(); + ((SwXBookmarks*)pBm)->Invalidate(); + delete pxXBookmarks; + pxXBookmarks = 0; + } + + if(pxXChapterNumbering) + { + XIndexReplace* pCh = pxXChapterNumbering->get(); + ((SwXChapterNumbering*)pCh)->Invalidate(); + delete pxXChapterNumbering; + pxXChapterNumbering = 0; + } + + if(pxXFootnoteSettings) + { + XPropertySet* pFntSet = pxXFootnoteSettings->get(); + ((SwXFootnoteProperties*)pFntSet)->Invalidate(); + delete pxXFootnoteSettings; + pxXFootnoteSettings = 0; + } + + if(pxXEndnoteSettings) + { + XPropertySet* pEndSet = pxXEndnoteSettings->get(); + ((SwXEndnoteProperties*)pEndSet)->Invalidate(); + delete pxXEndnoteSettings; + pxXEndnoteSettings = 0; + } + + if(pxXLineNumberingProperties) + { + XPropertySet* pLine = pxXLineNumberingProperties->get(); + ((SwXLineNumberingProperties*)pLine)->Invalidate(); + delete pxXLineNumberingProperties; + pxXLineNumberingProperties = 0; + } + if(pxXReferenceMarks) + { + XNameAccess* pMarks = pxXReferenceMarks->get(); + ((SwXReferenceMarks*)pMarks)->Invalidate(); + delete pxXReferenceMarks; + pxXReferenceMarks = 0; + } + if(pxLinkTargetSupplier) + { + XNameAccess* pAccess = (*pxLinkTargetSupplier).get(); + ((SwXLinkTargetSupplier*)pAccess)->Invalidate(); + delete pxLinkTargetSupplier; + pxLinkTargetSupplier = 0; + } + if(pxXRedlines) + { + XEnumerationAccess* pMarks = pxXRedlines->get(); + ((SwXRedlines*)pMarks)->Invalidate(); + delete pxXRedlines; + pxXRedlines = 0; + } + if(xPropertyHelper.is()) + { + pPropertyHelper->Invalidate(); + xPropertyHelper = 0; + pPropertyHelper = 0; + } +} + +css::uno::Reference<css::uno::XInterface> SwXTextDocument::create( + OUString const & rServiceName, + css::uno::Sequence<css::uno::Any> const * arguments) +{ + SolarMutexGuard aGuard; + if (!IsValid()) + { + throw RuntimeException(); + } + sal_uInt16 nType = SwXServiceProvider::GetProviderType(rServiceName); + if (nType != SW_SERVICE_INVALID) + { + return SwXServiceProvider::MakeInstance(nType, pDocShell->GetDoc()); + } + if (rServiceName == "com.sun.star.drawing.DashTable") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_DASH_TABLE); + } + if (rServiceName == "com.sun.star.drawing.GradientTable") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_GRADIENT_TABLE); + } + if (rServiceName == "com.sun.star.drawing.HatchTable") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_HATCH_TABLE); + } + if (rServiceName == "com.sun.star.drawing.BitmapTable") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_BITMAP_TABLE); + } + if (rServiceName == "com.sun.star.drawing.TransparencyGradientTable") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_TRANSGRADIENT_TABLE); + } + if (rServiceName == "com.sun.star.drawing.MarkerTable") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_MARKER_TABLE); + } + if (rServiceName == "com.sun.star.drawing.Defaults") + { + return GetPropertyHelper()->GetDrawTable(SW_CREATE_DRAW_DEFAULTS); + } + if (rServiceName == "com.sun.star.document.Settings") + { + return Reference<XInterface>(*new SwXDocumentSettings(this)); + } + if (rServiceName == "com.sun.star.document.ImportEmbeddedObjectResolver") + { + return static_cast<cppu::OWeakObject *>( + new SvXMLEmbeddedObjectHelper( + *pDocShell, EMBEDDEDOBJECTHELPER_MODE_READ)); + } + if (rServiceName == "com.sun.star.text.DocumentSettings") + { + return Reference<XInterface>(*new SwXDocumentSettings(this)); + } + if (rServiceName == "com.sun.star.chart2.data.DataProvider") + { + return Reference<XInterface>( + dynamic_cast<chart2::data::XDataProvider *>( + pDocShell->getIDocumentChartDataProviderAccess()-> + GetChartDataProvider())); + } + if (!rServiceName.startsWith("com.sun.star.") + || rServiceName.endsWith(".OLE2Shape")) + { + // We do not want to insert OLE2 Shapes (e.g., + // "com.sun.star.drawing.OLE2Shape", ...) like this (by creating them + // with the documents factory and adding the shapes to the draw page); + // for inserting OLE objects the proper way is to use + // "com.sun.star.text.TextEmbeddedObject": + throw ServiceNotRegisteredException(); + } + // The XML import is allowed to create instances of + // "com.sun.star.drawing.OLE2Shape"; thus, a temporary service name is + // introduced to make this possible: + OUString aTmpServiceName(rServiceName); + if (rServiceName == "com.sun.star.drawing.temporaryForXMLImportOLE2Shape") + { + aTmpServiceName = "com.sun.star.drawing.OLE2Shape"; + } + Reference<XInterface> xTmp( + arguments == 0 + ? SvxFmMSFactory::createInstance(aTmpServiceName) + : SvxFmMSFactory::createInstanceWithArguments( + aTmpServiceName, *arguments)); + if (rServiceName == "com.sun.star.drawing.GroupShape" + || rServiceName == "com.sun.star.drawing.Shape3DSceneObject") + { + return *new SwXGroupShape(xTmp); + } + if (rServiceName.startsWith("com.sun.star.drawing.")) + { + return *new SwXShape(xTmp); + } + return xTmp; +} + +Reference< XInterface > SwXTextDocument::createInstance(const OUString& rServiceName) + throw( Exception, RuntimeException, std::exception ) +{ + return create(rServiceName, 0); +} + +Reference< XInterface > SwXTextDocument::createInstanceWithArguments( + const OUString& ServiceSpecifier, + const Sequence< Any >& Arguments) + throw( Exception, RuntimeException, std::exception ) +{ + return create(ServiceSpecifier, &Arguments); +} + +Sequence< OUString > SwXTextDocument::getAvailableServiceNames(void) + throw( RuntimeException, std::exception ) +{ + static Sequence< OUString > aServices; + if ( aServices.getLength() == 0 ) + { + Sequence< OUString > aRet = SvxFmMSFactory::getAvailableServiceNames(); + OUString* pRet = aRet.getArray(); + for ( sal_Int32 i = 0; i < aRet.getLength(); ++i ) + { + if ( pRet[i].equalsAscii( "com.sun.star.drawing.OLE2Shape" ) ) + { + pRet[i] = pRet[aRet.getLength() - 1]; + aRet.realloc( aRet.getLength() - 1 ); // <pRet> no longer valid. + break; + } + } + Sequence< OUString > aOwn = SwXServiceProvider::GetAllServiceNames(); + aServices = SvxFmMSFactory::concatServiceNames(aRet, aOwn); + } + + return aServices; +} + +OUString SwXTextDocument::getImplementationName(void) throw( RuntimeException, std::exception ) +{ + return OUString("SwXTextDocument"); +} + +sal_Bool SwXTextDocument::supportsService(const OUString& rServiceName) throw( RuntimeException, std::exception ) +{ + return cppu::supportsService(this, rServiceName); +} + +Sequence< OUString > SwXTextDocument::getSupportedServiceNames(void) throw( RuntimeException, std::exception ) +{ + bool bWebDoc = (0 != PTR_CAST(SwWebDocShell, pDocShell)); + bool bGlobalDoc = (0 != PTR_CAST(SwGlobalDocShell, pDocShell)); + bool bTextDoc = (!bWebDoc && !bGlobalDoc); + + Sequence< OUString > aRet (3); + OUString* pArray = aRet.getArray(); + + pArray[0] = OUString ( ( "com.sun.star.document.OfficeDocument" ) ); + pArray[1] = OUString ( ( "com.sun.star.text.GenericTextDocument" ) ); + + if (bTextDoc) + pArray[2] = OUString ( ( "com.sun.star.text.TextDocument" ) ); + else if (bWebDoc) + pArray[2] = OUString ( ( "com.sun.star.text.WebDocument" ) ); + else if (bGlobalDoc) + pArray[2] = OUString ( ( "com.sun.star.text.GlobalDocument" ) ); + + return aRet; +} + +Reference< XIndexAccess > SwXTextDocument::getDocumentIndexes(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + if(!pxXDocumentIndexes) + { + ((SwXTextDocument*)this)->pxXDocumentIndexes = new Reference< XIndexAccess > ; + *pxXDocumentIndexes = new SwXDocumentIndexes(pDocShell->GetDoc()); + } + return *pxXDocumentIndexes; +} + +Reference< XPropertySetInfo > SwXTextDocument::getPropertySetInfo(void) throw( RuntimeException, std::exception ) +{ + static Reference< XPropertySetInfo > xRet = pPropSet->getPropertySetInfo(); + return xRet; +} + +void SwXTextDocument::setPropertyValue(const OUString& rPropertyName, const Any& aValue) + throw (UnknownPropertyException, PropertyVetoException, + IllegalArgumentException, WrappedTargetException, + RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException( + "invalid SwXTextDocument", + static_cast< cppu::OWeakObject * >( + static_cast< SwXTextDocumentBaseClass * >(this))); + const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap().getByName( rPropertyName); + + if(!pEntry) + throw UnknownPropertyException(); + if(pEntry->nFlags & PropertyAttribute::READONLY) + throw PropertyVetoException(); + switch(pEntry->nWID) + { + case WID_DOC_CHAR_COUNT : + case WID_DOC_PARA_COUNT : + case WID_DOC_WORD_COUNT : + throw RuntimeException( + "bad WID", + static_cast< cppu::OWeakObject * >( + static_cast< SwXTextDocumentBaseClass * >(this))); + case WID_DOC_WORD_SEPARATOR : + { + OUString sDelim; + aValue >>= sDelim; + SW_MOD()->GetModuleConfig()->SetWordDelimiter(sDelim); + } + break; + case WID_DOC_CHANGES_RECORD: + case WID_DOC_CHANGES_SHOW: + { + bool bSet = *(sal_Bool*)aValue.getValue(); + sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode(); + if(WID_DOC_CHANGES_SHOW == pEntry->nWID) + { + eMode &= ~(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE); + eMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT; + if( bSet ) + eMode |= nsRedlineMode_t::REDLINE_SHOW_DELETE; + } + else if(WID_DOC_CHANGES_RECORD == pEntry->nWID) + { + eMode = bSet ? eMode|nsRedlineMode_t::REDLINE_ON : eMode&~nsRedlineMode_t::REDLINE_ON; + } + pDocShell->GetDoc()->SetRedlineMode( (RedlineMode_t)(eMode )); + } + break; + case WID_DOC_CHANGES_PASSWORD: + { + Sequence <sal_Int8> aNew; + if(aValue >>= aNew) + { + SwDoc* pDoc = pDocShell->GetDoc(); + pDoc->SetRedlinePassword(aNew); + if(aNew.getLength()) + { + sal_uInt16 eMode = pDoc->GetRedlineMode(); + eMode = eMode|nsRedlineMode_t::REDLINE_ON; + pDoc->SetRedlineMode( (RedlineMode_t)(eMode )); + } + } + } + break; + case WID_DOC_AUTO_MARK_URL : + { + OUString sURL; + aValue >>= sURL; + pDocShell->GetDoc()->SetTOIAutoMarkURL(sURL); + } + break; + case WID_DOC_HIDE_TIPS : + SW_MOD()->GetModuleConfig()->SetHideFieldTips(*(sal_Bool*)aValue.getValue()); + break; + case WID_DOC_REDLINE_DISPLAY: + { + sal_Int16 eRedMode = pDocShell->GetDoc()->GetRedlineMode(); + eRedMode = eRedMode & (~nsRedlineMode_t::REDLINE_SHOW_MASK); + sal_Int16 nSet = 0; + aValue >>= nSet; + switch(nSet) + { + case RedlineDisplayType::NONE: break; + case RedlineDisplayType::INSERTED: eRedMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT; break; + case RedlineDisplayType::REMOVED: eRedMode |= nsRedlineMode_t::REDLINE_SHOW_DELETE; break; + case RedlineDisplayType:: + INSERTED_AND_REMOVED: eRedMode |= nsRedlineMode_t::REDLINE_SHOW_INSERT|nsRedlineMode_t::REDLINE_SHOW_DELETE; + break; + default: throw IllegalArgumentException(); + } + pDocShell->GetDoc()->SetRedlineMode(eRedMode); + } + break; + case WID_DOC_TWO_DIGIT_YEAR: + { + sal_Int16 nYear = 0; + aValue >>= nYear; + SfxRequest aRequest ( SID_ATTR_YEAR2000, SFX_CALLMODE_SLOT, pDocShell->GetDoc()->GetAttrPool()); + aRequest.AppendItem(SfxUInt16Item( SID_ATTR_YEAR2000, static_cast < sal_uInt16 > ( nYear ) ) ); + pDocShell->Execute ( aRequest ); + } + break; + case WID_DOC_AUTOMATIC_CONTROL_FOCUS: + { + SwDrawDocument * pDrawDoc; + bool bAuto = *(sal_Bool*) aValue.getValue(); + + if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * >( pDocShell->GetDoc()->GetDrawModel() ) ) ) + pDrawDoc->SetAutoControlFocus( bAuto ); + else if (bAuto) + { + // if setting to true, and we don't have an + // SdrModel, then we are changing the default and + // must thus create an SdrModel, if we don't have an + // SdrModel and we are leaving the default at false, + // we don't need to make an SdrModel and can do nothing + // #i52858# - method name changed + pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetOrCreateDrawModel() ); + pDrawDoc->SetAutoControlFocus ( bAuto ); + } + } + break; + case WID_DOC_APPLY_FORM_DESIGN_MODE: + { + SwDrawDocument * pDrawDoc; + bool bMode = *(sal_Bool*)aValue.getValue(); + + if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetDrawModel() ) ) ) + pDrawDoc->SetOpenInDesignMode( bMode ); + else if (!bMode) + { + // if setting to false, and we don't have an + // SdrModel, then we are changing the default and + // must thus create an SdrModel, if we don't have an + // SdrModel and we are leaving the default at true, + // we don't need to make an SdrModel and can do + // nothing + // #i52858# - method name changed + pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetOrCreateDrawModel() ); + pDrawDoc->SetOpenInDesignMode ( bMode ); + } + } + break; + // #i42634# New property to set the bInReading + // flag at the document, used during binary import + case WID_DOC_LOCK_UPDATES : + { + SwDoc* pDoc = pDocShell->GetDoc(); + bool bBool (false); + if( aValue >>= bBool ) + pDoc->SetInReading( bBool ); + } + break; + case WID_DOC_BUILDID: + aValue >>= maBuildId; + break; + + case WID_DOC_DEFAULT_PAGE_MODE: + { + bool bDefaultPageMode( false ); + aValue >>= bDefaultPageMode; + pDocShell->GetDoc()->SetDefaultPageMode( bDefaultPageMode ); + } + break; + case WID_DOC_INTEROP_GRAB_BAG: + setGrabBagItem(aValue); + break; + + default: + { + const SfxPoolItem& rItem = pDocShell->GetDoc()->GetDefault(pEntry->nWID); + SfxPoolItem* pNewItem = rItem.Clone(); + pNewItem->PutValue(aValue, pEntry->nMemberId); + pDocShell->GetDoc()->SetDefault(*pNewItem); + delete pNewItem; + } + } +} + +Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap().getByName( rPropertyName); + + if(!pEntry) + throw UnknownPropertyException(); + Any aAny; + switch(pEntry->nWID) + { + case WID_DOC_ISTEMPLATEID : + aAny <<= pDocShell->IsTemplate(); + break; + case WID_DOC_CHAR_COUNT : + case WID_DOC_PARA_COUNT : + case WID_DOC_WORD_COUNT : + { + const SwDocStat& rStat(pDocShell->GetDoc()->GetUpdatedDocStat()); + sal_Int32 nValue; + switch(pEntry->nWID) + { + case WID_DOC_CHAR_COUNT :nValue = rStat.nChar;break; + case WID_DOC_PARA_COUNT :nValue = rStat.nPara;break; + case WID_DOC_WORD_COUNT :nValue = rStat.nWord;break; + } + aAny <<= nValue; + } + break; + case WID_DOC_WORD_SEPARATOR : + { + aAny <<= SW_MOD()->GetDocStatWordDelim(); + } + break; + case WID_DOC_CHANGES_RECORD: + case WID_DOC_CHANGES_SHOW: + { + sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode(); + bool bSet = false; + if(WID_DOC_CHANGES_SHOW == pEntry->nWID) + { + sal_uInt16 nMask = nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE; + bSet = (eMode & nMask) == nMask; + } + else if(WID_DOC_CHANGES_RECORD == pEntry->nWID) + { + bSet = (eMode& nsRedlineMode_t::REDLINE_ON) != 0; + } + aAny.setValue(&bSet, ::getBooleanCppuType()); + } + break; + case WID_DOC_CHANGES_PASSWORD: + { + SwDoc* pDoc = pDocShell->GetDoc(); + aAny <<= pDoc->GetRedlinePassword(); + } + break; + case WID_DOC_AUTO_MARK_URL : + aAny <<= pDocShell->GetDoc()->GetTOIAutoMarkURL(); + break; + case WID_DOC_HIDE_TIPS : + { + bool bTemp = SW_MOD()->GetModuleConfig()->IsHideFieldTips(); + aAny.setValue(&bTemp, ::getBooleanCppuType()); + } + break; + case WID_DOC_REDLINE_DISPLAY: + { + sal_Int16 eRedMode = pDocShell->GetDoc()->GetRedlineMode(); + eRedMode = eRedMode & nsRedlineMode_t::REDLINE_SHOW_MASK; + sal_Int16 nRet = RedlineDisplayType::NONE; + if(nsRedlineMode_t::REDLINE_SHOW_INSERT == eRedMode) + nRet = RedlineDisplayType::INSERTED; + else if(nsRedlineMode_t::REDLINE_SHOW_DELETE == eRedMode) + nRet = RedlineDisplayType::REMOVED; + else if(nsRedlineMode_t::REDLINE_SHOW_MASK == eRedMode) + nRet = RedlineDisplayType::INSERTED_AND_REMOVED; + aAny <<= nRet; + } + break; + case WID_DOC_FORBIDDEN_CHARS: + { + GetPropertyHelper(); + Reference<XForbiddenCharacters> xRet(xPropertyHelper, UNO_QUERY); + aAny <<= xRet; + } + break; + case WID_DOC_TWO_DIGIT_YEAR: + { + aAny <<= static_cast < sal_Int16 > (pDocShell->GetDoc()->GetNumberFormatter ( true )->GetYear2000()); + } + break; + case WID_DOC_AUTOMATIC_CONTROL_FOCUS: + { + SwDrawDocument * pDrawDoc; + bool bAuto; + if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetDrawModel() ) ) ) + bAuto = pDrawDoc->GetAutoControlFocus(); + else + bAuto = false; + aAny <<= bAuto; + } + break; + case WID_DOC_APPLY_FORM_DESIGN_MODE: + { + SwDrawDocument * pDrawDoc; + bool bMode; + if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetDrawModel() ) ) ) + bMode = pDrawDoc->GetOpenInDesignMode(); + else + bMode = true; + aAny <<= bMode; + } + break; + case WID_DOC_BASIC_LIBRARIES: + aAny <<= pDocShell->GetBasicContainer(); + break; + case WID_DOC_DIALOG_LIBRARIES: + aAny <<= pDocShell->GetDialogContainer(); + break; + case WID_DOC_VBA_DOCOBJ: + { + beans::PropertyValue aProp; + aProp.Name = "ThisWordDoc"; + aProp.Value <<= pDocShell->GetModel(); + aAny <<= aProp; + } + break; + case WID_DOC_RUNTIME_UID: + aAny <<= getRuntimeUID(); + break; + case WID_DOC_LOCK_UPDATES : + aAny <<= static_cast<bool>( pDocShell->GetDoc()->IsInReading() ); + break; + case WID_DOC_BUILDID: + aAny <<= maBuildId; + break; + case WID_DOC_HAS_VALID_SIGNATURES: + aAny <<= hasValidSignatures(); + break; + case WID_DOC_INTEROP_GRAB_BAG: + getGrabBagItem(aAny); + break; + + default: + { + const SfxPoolItem& rItem = pDocShell->GetDoc()->GetDefault(pEntry->nWID); + rItem.QueryValue(aAny, pEntry->nMemberId); + } + } + return aAny; +} + +void SwXTextDocument::addPropertyChangeListener(const OUString& /*PropertyName*/, + const Reference< XPropertyChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + OSL_FAIL("not implemented"); +} + +void SwXTextDocument::removePropertyChangeListener(const OUString& /*PropertyName*/, + const Reference< XPropertyChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + OSL_FAIL("not implemented"); +} + +void SwXTextDocument::addVetoableChangeListener(const OUString& /*PropertyName*/, + const Reference< XVetoableChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + OSL_FAIL("not implemented"); +} + +void SwXTextDocument::removeVetoableChangeListener(const OUString& /*PropertyName*/, + const Reference< XVetoableChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + OSL_FAIL("not implemented"); +} + +Reference< XNameAccess > SwXTextDocument::getLinks(void) throw( RuntimeException, std::exception ) +{ + if(!pxLinkTargetSupplier) + { + pxLinkTargetSupplier = new Reference< XNameAccess > ; + (*pxLinkTargetSupplier) = new SwXLinkTargetSupplier(*(SwXTextDocument*)this); + } + return (*pxLinkTargetSupplier); +} + +Reference< XEnumerationAccess > SwXTextDocument::getRedlines( ) throw(RuntimeException, std::exception) +{ + if(!pxXRedlines) + { + pxXRedlines = new Reference< XEnumerationAccess > ; + (*pxXRedlines) = new SwXRedlines(pDocShell->GetDoc()); + } + return *pxXRedlines; +} + +void SwXTextDocument::NotifyRefreshListeners() +{ + // why does SwBaseShell not just call refresh? maybe because it's rSh is + // (sometimes) a different shell than GetWrtShell()? + lang::EventObject const ev(static_cast<SwXTextDocumentBaseClass &>(*this)); + m_pImpl->m_RefreshListeners.notifyEach( + & util::XRefreshListener::refreshed, ev); +} + +void SwXTextDocument::refresh(void) throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + SwViewShell *pViewShell = pDocShell->GetWrtShell(); + NotifyRefreshListeners(); + if(pViewShell) + pViewShell->CalcLayout(); +} + +void SAL_CALL SwXTextDocument::addRefreshListener( + const Reference<util::XRefreshListener> & xListener) +throw (RuntimeException, std::exception) +{ + // no need to lock here as m_pImpl is const and container threadsafe + m_pImpl->m_RefreshListeners.addInterface(xListener); +} + +void SAL_CALL SwXTextDocument::removeRefreshListener( + const Reference<util::XRefreshListener> & xListener) +throw (RuntimeException, std::exception) +{ + // no need to lock here as m_pImpl is const and container threadsafe + m_pImpl->m_RefreshListeners.removeInterface(xListener); +} + +void SwXTextDocument::updateLinks( ) throw(RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + SwDoc* pDoc = pDocShell->GetDoc(); + sfx2::LinkManager& rLnkMan = pDoc->GetLinkManager(); + if( !rLnkMan.GetLinks().empty() ) + { + UnoActionContext aAction(pDoc); + rLnkMan.UpdateAllLinks( false, false, true ); + } +} + +//XPropertyState +PropertyState SAL_CALL SwXTextDocument::getPropertyState( const OUString& rPropertyName ) + throw (UnknownPropertyException, RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + PropertyState eRet = PropertyState_DIRECT_VALUE; + if(!IsValid()) + throw RuntimeException(); + const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap().getByName( rPropertyName); + + if(!pEntry) + throw UnknownPropertyException(); + switch(pEntry->nWID) + { + case 0:default:break; + } + return eRet; +} + +Sequence< PropertyState > SAL_CALL SwXTextDocument::getPropertyStates( const Sequence< OUString >& rPropertyNames ) + throw (UnknownPropertyException, RuntimeException, std::exception) +{ + const sal_Int32 nCount = rPropertyNames.getLength(); + const OUString * pNames = rPropertyNames.getConstArray(); + Sequence < PropertyState > aRet ( nCount ); + PropertyState *pState = aRet.getArray(); + + for ( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++) + pState[nIndex] = getPropertyState( pNames[nIndex] ); + + return aRet; +} + +void SAL_CALL SwXTextDocument::setPropertyToDefault( const OUString& rPropertyName ) + throw (UnknownPropertyException, RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap().getByName( rPropertyName); + if(!pEntry) + throw UnknownPropertyException(); + switch(pEntry->nWID) + { + case 0:default:break; + } +} + +Any SAL_CALL SwXTextDocument::getPropertyDefault( const OUString& rPropertyName ) + throw (UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap().getByName( rPropertyName); + if(!pEntry) + throw UnknownPropertyException(); + Any aAny; + switch(pEntry->nWID) + { + case 0:default:break; + } + return aAny; +} + +static OutputDevice * lcl_GetOutputDevice( const SwPrintUIOptions &rPrintUIOptions ) +{ + OutputDevice *pOut = 0; + + uno::Any aAny( rPrintUIOptions.getValue( "RenderDevice" )); + uno::Reference< awt::XDevice > xRenderDevice; + aAny >>= xRenderDevice; + if (xRenderDevice.is()) + { + VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice ); + pOut = pDevice ? pDevice->GetOutputDevice() : 0; + } + + return pOut; +} + +static bool lcl_SeqHasProperty( + const uno::Sequence< beans::PropertyValue >& rOptions, + const sal_Char *pPropName ) +{ + bool bRes = false; + const sal_Int32 nLen = rOptions.getLength(); + const beans::PropertyValue *pProps = rOptions.getConstArray(); + for (sal_Int32 i = 0; i < nLen && !bRes; ++i) + { + if (pProps[i].Name.equalsAscii( pPropName )) + bRes = true; + } + return bRes; +} + +SfxViewShell * SwXTextDocument::GetRenderView( + bool &rbIsSwSrcView, + const uno::Sequence< beans::PropertyValue >& rOptions, + bool bIsPDFExport ) +{ + // get view shell to use + SfxViewShell *pView = 0; + if (bIsPDFExport) + pView = GuessViewShell( rbIsSwSrcView ); + else + { + uno::Any aTmp; + const sal_Int32 nLen = rOptions.getLength(); + const beans::PropertyValue *pProps = rOptions.getConstArray(); + for (sal_Int32 i = 0; i < nLen; ++i) + { + if ( pProps[i].Name == "View" ) + { + aTmp = pProps[i].Value; + break; + } + } + + uno::Reference< frame::XController > xController; + if (aTmp >>= xController) + { + OSL_ENSURE( xController.is(), "controller is empty!" ); + pView = GuessViewShell( rbIsSwSrcView, xController ); + } + } + return pView; +} + +/* + * GetRenderDoc: + * returns the document to be rendered, usually this will be the 'regular' + * document but in case of PDF export of (multi-)selection it will + * be a temporary document that gets created if not already done. + * The rpView variable will be set (if not already done) to the used + * SfxViewShell. +*/ +SwDoc * SwXTextDocument::GetRenderDoc( + SfxViewShell *&rpView, + const uno::Any& rSelection, + bool bIsPDFExport ) +{ + SwDoc *pDoc = 0; + + uno::Reference< frame::XModel > xModel; + rSelection >>= xModel; + if (xModel == pDocShell->GetModel()) + pDoc = pDocShell->GetDoc(); + else + { + OSL_ENSURE( !xModel.is(), "unexpected model found" ); + + if (rSelection.hasValue()) // is anything selected ? + { + // this part should only be called when a temporary document needs to be created, + // for example for PDF export or printing of (multi-)selection only. + + bool bIsSwSrcView = false; + if (!rpView) + { + (void) bIsPDFExport; + // aside from maybe PDF export the view should always have been provided! + OSL_ENSURE( bIsPDFExport, "view is missing, guessing one..." ); + + rpView = GuessViewShell( bIsSwSrcView ); + } + OSL_ENSURE( rpView, "SwViewShell missing" ); + // the view shell should be SwView for documents PDF export. + // for the page preview no selection should be possible + // (the export dialog does not allow for this option) + const TypeId aSwViewTypeId = TYPE(SwView); + if (rpView && rpView->IsA(aSwViewTypeId)) + { + if (!m_pRenderData) + { + OSL_FAIL("GetRenderDoc: no renderdata"); + return 0; + } + SwView *const pSwView(static_cast<SwView *>(rpView)); + SfxObjectShellLock xDocSh(m_pRenderData->GetTempDocShell()); + if (!xDocSh.Is()) + { + xDocSh = pSwView->CreateTmpSelectionDoc(); + m_pRenderData->SetTempDocShell(xDocSh); + } + if (xDocSh.Is()) + { + pDoc = ((SwDocShell*)&xDocSh)->GetDoc(); + rpView = pDoc->GetDocShell()->GetView(); + } + } + else + { + OSL_FAIL("unexpected SwViewShell" ); + } + } + } + return pDoc; +} + +static void lcl_SavePrintUIOptionsToDocumentPrintData( + SwDoc &rDoc, + const SwPrintUIOptions &rPrintUIOptions, + bool bIsPDFEXport ) +{ + SwPrintData aDocPrintData( rDoc.getPrintData() ); + + aDocPrintData.SetPrintGraphic( rPrintUIOptions.IsPrintGraphics() ); + aDocPrintData.SetPrintTable( rPrintUIOptions.IsPrintTables() ); + aDocPrintData.SetPrintDraw( rPrintUIOptions.IsPrintDrawings() ); + aDocPrintData.SetPrintControl( rPrintUIOptions.IsPrintFormControls() ); + aDocPrintData.SetPrintLeftPage( rPrintUIOptions.IsPrintLeftPages() ); + aDocPrintData.SetPrintRightPage( rPrintUIOptions.IsPrintRightPages() ); + aDocPrintData.SetPrintReverse( rPrintUIOptions.IsPrintReverse() ); + aDocPrintData.SetPaperFromSetup( rPrintUIOptions.IsPaperFromSetup() ); + aDocPrintData.SetPrintEmptyPages( rPrintUIOptions.IsPrintEmptyPages( bIsPDFEXport ) ); + aDocPrintData.SetPrintPostIts( rPrintUIOptions.GetPrintPostItsType() ); + aDocPrintData.SetPrintProspect( rPrintUIOptions.IsPrintProspect() ); + aDocPrintData.SetPrintProspect_RTL( rPrintUIOptions.IsPrintProspectRTL() ); + aDocPrintData.SetPrintPageBackground( rPrintUIOptions.IsPrintPageBackground() ); + aDocPrintData.SetPrintBlackFont( rPrintUIOptions.IsPrintWithBlackTextColor() ); + // aDocPrintData.SetPrintSingleJobs( b ); handled by File/Print dialog itself + // arDocPrintData.SetFaxName( s ); n/a in File/Print dialog + aDocPrintData.SetPrintHiddenText( rPrintUIOptions.IsPrintHiddenText() ); + aDocPrintData.SetPrintTextPlaceholder( rPrintUIOptions.IsPrintTextPlaceholders() ); + + rDoc.setPrintData( aDocPrintData ); +} + +sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( + const uno::Any& rSelection, + const uno::Sequence< beans::PropertyValue >& rxOptions ) + throw (IllegalArgumentException, RuntimeException, + std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + { + throw DisposedException( OUString(), + static_cast< XTextDocument* >(this) ); + } + + const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" ); + bool bIsSwSrcView = false; + SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport ); + + if (!bIsSwSrcView && !m_pRenderData) + m_pRenderData = new SwRenderData; + if (!m_pPrintUIOptions) + m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView ); + bool bFormat = m_pPrintUIOptions->processPropertiesAndCheckFormat( rxOptions ); + + SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport ); + OSL_ENSURE( pDoc && pView, "doc or view shell missing!" ); + if (!pDoc || !pView) + return 0; + + // save current UI options from the print dialog for the next call to that dialog + lcl_SavePrintUIOptionsToDocumentPrintData( *pDoc, *m_pPrintUIOptions, bIsPDFExport ); + + sal_Int32 nRet = 0; + if (bIsSwSrcView) + { + SwSrcView *pSwSrcView = dynamic_cast< SwSrcView * >(pView); + OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); + nRet = pSwSrcView->PrintSource( pOutDev, 1 /* dummy */, true /* get page count only */ ); + } + else + { + SwDocShell *pRenderDocShell = pDoc->GetDocShell(); + + // TODO/mba: we really need a generic way to get the SwViewShell! + SwViewShell* pViewShell = 0; + SwView* pSwView = PTR_CAST(SwView, pView); + if ( pSwView ) + { + pViewShell = pSwView->GetWrtShellPtr(); + } + else + { + if ( bIsPDFExport && bFormat ) + { + //create a hidden view to be able to export as PDF also in print preview + //pView and pSwView are not changed intentionally! + m_pHiddenViewFrame = SfxViewFrame::LoadHiddenDocument( *pRenderDocShell, 2 ); + pViewShell = ((SwView*)m_pHiddenViewFrame->GetViewShell())->GetWrtShellPtr(); + } + else + pViewShell = ((SwPagePreview*)pView)->GetViewShell(); + } + + if (!pViewShell || !pViewShell->GetLayout()) + return 0; + + if (bFormat) + { + // #i38289 + if( pViewShell->GetViewOptions()->getBrowseMode() ) + { + SwViewOption aOpt( *pViewShell->GetViewOptions() ); + aOpt.setBrowseMode( false ); + pViewShell->ApplyViewOptions( aOpt ); + if (pSwView) + { + pSwView->RecheckBrowseMode(); + } + } + + // reformatting the document for printing will show the changes in the view + // which is likely to produce many unwanted and not nice to view actions. + // We don't want that! Thus we disable updating of the view. + pViewShell->StartAction(); + + if (pSwView) + { + if (m_pRenderData && m_pRenderData->NeedNewViewOptionAdjust( *pViewShell ) ) + m_pRenderData->ViewOptionAdjustStop(); + if (m_pRenderData && !m_pRenderData->IsViewOptionAdjust()) + { + m_pRenderData->ViewOptionAdjustStart( + *pViewShell, *pViewShell->GetViewOptions() ); + } + } + + m_pRenderData->MakeSwPrtOptions( pRenderDocShell, + m_pPrintUIOptions, bIsPDFExport ); + + if (pSwView) + { + // PDF export should not make use of the SwPrtOptions + const SwPrintData *pPrtOptions = (bIsPDFExport) + ? NULL : m_pRenderData->GetSwPrtOptions(); + m_pRenderData->ViewOptionAdjust( pPrtOptions ); + } + + // since printing now also use the API for PDF export this option + // should be set for printing as well ... + pViewShell->SetPDFExportOption( true ); + bool bOrigStatus = pRenderDocShell->IsEnableSetModified(); + // check configuration: shall update of printing information in DocInfo set the document to "modified"? + bool bStateChanged = false; + if ( bOrigStatus && !SvtPrintWarningOptions().IsModifyDocumentOnPrintingAllowed() ) + { + pRenderDocShell->EnableSetModified( false ); + bStateChanged = true; + } + + // #122919# Force field update before PDF export + pViewShell->SwViewShell::UpdateFlds(true); + if( bStateChanged ) + pRenderDocShell->EnableSetModified( true ); + + // there is some redundancy between those two function calls, but right now + // there is no time to sort this out. + //TODO: check what exatly needs to be done and make just one function for that + pViewShell->CalcLayout(); + pViewShell->CalcPagesForPrint( pViewShell->GetPageCount() ); + + pViewShell->SetPDFExportOption( false ); + + // enable view again + pViewShell->EndAction(); + } + + const sal_Int32 nPageCount = pViewShell->GetPageCount(); + + // get number of pages to be rendered + + const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); + if (bPrintProspect) + { + pDoc->CalculatePagePairsForProspectPrinting( *pViewShell->GetLayout(), *m_pRenderData, *m_pPrintUIOptions, nPageCount ); + nRet = m_pRenderData->GetPagePairsForProspectPrinting().size(); + } + else + { + const sal_Int16 nPostItMode = (sal_Int16) m_pPrintUIOptions->getIntValue( "PrintAnnotationMode", 0 ); + if (nPostItMode != POSTITS_NONE) + { + OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); + m_pRenderData->CreatePostItData( pDoc, pViewShell->GetViewOptions(), pOutDev ); + } + + // get set of valid document pages (according to the current settings) + // and their start frames + pDoc->CalculatePagesForPrinting( *pViewShell->GetLayout(), *m_pRenderData, *m_pPrintUIOptions, bIsPDFExport, nPageCount ); + + if (nPostItMode != POSTITS_NONE) + { + pDoc->UpdatePagesForPrintingWithPostItData( *m_pRenderData, + *m_pPrintUIOptions, bIsPDFExport, nPageCount ); + } + + nRet = m_pRenderData->GetPagesToPrint().size(); + } + } + OSL_ENSURE( nRet >= 0, "negative number of pages???" ); + + return nRet; +} + +uno::Sequence< beans::PropertyValue > SAL_CALL SwXTextDocument::getRenderer( + sal_Int32 nRenderer, + const uno::Any& rSelection, + const uno::Sequence< beans::PropertyValue >& rxOptions ) + throw (IllegalArgumentException, RuntimeException, + std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + { + throw DisposedException( OUString(), + static_cast< XTextDocument* >(this) ); + } + + const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" ); + bool bIsSwSrcView = false; + SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport ); + + // m_pRenderData should NOT be created here! + // That should only be done in getRendererCount. If this function is called before + // getRendererCount was called then the caller will probably just retrieve the extra UI options + // and is not interested in getting valid information about the other data that would + // otherwise be provided here! +// if( ! m_pRenderData ) +// m_pRenderData = new SwRenderData; + if (!m_pPrintUIOptions) + m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView ); + m_pPrintUIOptions->processProperties( rxOptions ); + const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); + const bool bIsSkipEmptyPages = !m_pPrintUIOptions->IsPrintEmptyPages( bIsPDFExport ); + const bool bPrintPaperFromSetup = m_pPrintUIOptions->getBoolValue( "PrintPaperFromSetup", false ); + + SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport ); + OSL_ENSURE( pDoc && pView, "doc or view shell missing!" ); + if (!pDoc || !pView) + return uno::Sequence< beans::PropertyValue >(); + + // due to #110067# (document page count changes sometimes during + // PDF export/printing) we can not check for the upper bound properly. + // Thus instead of throwing the exception we silently return. + if (0 > nRenderer) + throw IllegalArgumentException(); + + // TODO/mba: we really need a generic way to get the SwViewShell! + SwViewShell* pVwSh = 0; + SwView* pSwView = PTR_CAST(SwView, pView); + if ( pSwView ) + pVwSh = pSwView->GetWrtShellPtr(); + else + pVwSh = ((SwPagePreview*)pView)->GetViewShell(); + + sal_Int32 nMaxRenderer = 0; + if (!bIsSwSrcView && m_pRenderData) + { + OSL_ENSURE( m_pRenderData, "m_pRenderData missing!!" ); + nMaxRenderer = bPrintProspect? + m_pRenderData->GetPagePairsForProspectPrinting().size() - 1 : + m_pRenderData->GetPagesToPrint().size() - 1; + } + // since SwSrcView::PrintSource is a poor implementation to get the number of pages to print + // we obmit checking of the upper bound in this case. + if (!bIsSwSrcView && m_pRenderData && nRenderer > nMaxRenderer) + return uno::Sequence< beans::PropertyValue >(); + + uno::Sequence< beans::PropertyValue > aRenderer; + if (m_pRenderData) + { + // #i114210# + // determine the correct page number from the renderer index + // #i114875 + // consider brochure print + const sal_uInt16 nPage = bPrintProspect + ? nRenderer + 1 + : m_pRenderData->GetPagesToPrint()[ nRenderer ]; + + // get paper tray to use ... + sal_Int32 nPrinterPaperTray = -1; + if (! bPrintPaperFromSetup) + { + // ... from individual page style (see the page tab in Format/Page dialog) + const std::map< sal_Int32, sal_Int32 > &rPaperTrays = m_pRenderData->GetPrinterPaperTrays(); + std::map< sal_Int32, sal_Int32 >::const_iterator aIt( rPaperTrays.find( nPage ) ); + if (aIt != rPaperTrays.end()) + nPrinterPaperTray = aIt->second; + } + + awt::Size aPageSize; + awt::Size aPreferredPageSize; + Size aTmpSize; + if (bIsSwSrcView || bPrintProspect) + { + // for printing of HTML source code and prospect printing we should use + // the printers paper size since + // a) HTML source view has no page size + // b) prospect printing has a different page size from the documents page + // since two document pages will get rendered on one printer page + + // since PageIncludesNonprintableArea will be set to true we can return the + // printers paper size here. + // Sometimes 'getRenderer' is only called to get "ExtraPrintUIOptions", in this + // case we won't get an OutputDevice here, but then the caller also has no need + // for the correct PageSisze right now... + Printer *pPrinter = dynamic_cast< Printer * >(lcl_GetOutputDevice( *m_pPrintUIOptions )); + if (pPrinter) + { + // HTML source view and prospect adapt to the printer's paper size + aTmpSize = pPrinter->GetPaperSize(); + aTmpSize = pPrinter->LogicToLogic( aTmpSize, + pPrinter->GetMapMode(), MapMode( MAP_100TH_MM )); + aPageSize = awt::Size( aTmpSize.Width(), aTmpSize.Height() ); + #if 0 + // #i115048# it seems users didn't like getting double the formatted page size + // revert to "old" behavior scaling to the current paper size of the printer + if (bPrintProspect) + { + // we just state what output size we would need + // which may cause vcl to set that page size on the printer + // (if available and not overridden by the user) + aTmpSize = pVwSh->GetPageSize( nPage, bIsSkipEmptyPages ); + aPreferredPageSize = awt::Size ( convertTwipToMm100( 2 * aTmpSize.Width() ), + convertTwipToMm100( aTmpSize.Height() )); + } + #else + if( bPrintProspect ) + { + // just switch to an appropriate portrait/landscape format + // FIXME: brochure printing with landscape pages puts the + // pages next to each other, so landscape is currently always + // the better choice + if( aPageSize.Width < aPageSize.Height ) + { + aPreferredPageSize.Width = aPageSize.Height; + aPreferredPageSize.Height = aPageSize.Width; + } + } + #endif + } + } + else + { + aTmpSize = pVwSh->GetPageSize( nPage, bIsSkipEmptyPages ); + aPageSize = awt::Size ( convertTwipToMm100( aTmpSize.Width() ), + convertTwipToMm100( aTmpSize.Height() )); + } + + sal_Int32 nLen = 2; + aRenderer.realloc(2); + aRenderer[0].Name = "PageSize"; + aRenderer[0].Value <<= aPageSize; + aRenderer[1].Name = "PageIncludesNonprintableArea"; + aRenderer[1].Value <<= sal_True; + if (aPreferredPageSize.Width && aPreferredPageSize.Height) + { + ++nLen; + aRenderer.realloc( nLen ); + aRenderer[ nLen - 1 ].Name = "PreferredPageSize"; + aRenderer[ nLen - 1 ].Value <<= aPreferredPageSize; + } + if (nPrinterPaperTray >= 0) + { + ++nLen; + aRenderer.realloc( nLen ); + aRenderer[ nLen - 1 ].Name = "PrinterPaperTray"; + aRenderer[ nLen - 1 ].Value <<= nPrinterPaperTray; + } + } + + // #i117783# + if ( bApplyPagePrintSettingsFromXPagePrintable ) + { + const SwPagePreviewPrtData* pPagePrintSettings = + pDocShell->GetDoc()->GetPreviewPrtData(); + if ( pPagePrintSettings && + ( pPagePrintSettings->GetRow() > 1 || + pPagePrintSettings->GetCol() > 1 ) ) + { + // extend render data by page print settings attributes + sal_Int32 nLen = aRenderer.getLength(); + const sal_Int32 nRenderDataIdxStart = nLen; + nLen += 9; + aRenderer.realloc( nLen ); + // put page print settings attribute into render data + const sal_Int32 nRow = pPagePrintSettings->GetRow(); + aRenderer[ nRenderDataIdxStart + 0 ].Name = "NUpRows"; + aRenderer[ nRenderDataIdxStart + 0 ].Value <<= ( nRow > 1 ? nRow : 1 ); + const sal_Int32 nCol = pPagePrintSettings->GetCol(); + aRenderer[ nRenderDataIdxStart + 1 ].Name = "NUpColumns"; + aRenderer[ nRenderDataIdxStart + 1 ].Value <<= ( nCol > 1 ? nCol : 1 ); + aRenderer[ nRenderDataIdxStart + 2 ].Name = "NUpPageMarginLeft"; + aRenderer[ nRenderDataIdxStart + 2 ].Value <<= pPagePrintSettings->GetLeftSpace(); + aRenderer[ nRenderDataIdxStart + 3 ].Name = "NUpPageMarginRight"; + aRenderer[ nRenderDataIdxStart + 3 ].Value <<= pPagePrintSettings->GetRightSpace(); + aRenderer[ nRenderDataIdxStart + 4 ].Name = "NUpPageMarginTop"; + aRenderer[ nRenderDataIdxStart + 4 ].Value <<= pPagePrintSettings->GetTopSpace(); + aRenderer[ nRenderDataIdxStart + 5 ].Name = "NUpPageMarginBottom"; + aRenderer[ nRenderDataIdxStart + 5 ].Value <<= pPagePrintSettings->GetBottomSpace(); + aRenderer[ nRenderDataIdxStart + 6 ].Name = "NUpHorizontalSpacing"; + aRenderer[ nRenderDataIdxStart + 6 ].Value <<= pPagePrintSettings->GetHorzSpace(); + aRenderer[ nRenderDataIdxStart + 7 ].Name = "NUpVerticalSpacing"; + aRenderer[ nRenderDataIdxStart + 7 ].Value <<= pPagePrintSettings->GetVertSpace(); + { + Printer* pPrinter = pDocShell->GetDoc()->getPrinter( false ); + if ( pPrinter ) + { + awt::Size aNewPageSize; + const Size aPageSize = pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ); + aNewPageSize = awt::Size( aPageSize.Width(), aPageSize.Height() ); + if ( ( pPagePrintSettings->GetLandscape() && + aPageSize.Width() < aPageSize.Height() ) || + ( !pPagePrintSettings->GetLandscape() && + aPageSize.Width() > aPageSize.Height() ) ) + { + aNewPageSize = awt::Size( aPageSize.Height(), aPageSize.Width() ); + } + aRenderer[ nRenderDataIdxStart + 8 ].Name = "NUpPaperSize"; + aRenderer[ nRenderDataIdxStart + 8 ].Value <<= aNewPageSize; + } + } + } + + bApplyPagePrintSettingsFromXPagePrintable = false; + } + + m_pPrintUIOptions->appendPrintUIOptions( aRenderer ); + + return aRenderer; +} + +SfxViewShell * SwXTextDocument::GuessViewShell( + /* out */ bool &rbIsSwSrcView, + const uno::Reference< css::frame::XController > xController ) +{ + // #130810# SfxViewShell::Current() / SfxViewShell::GetObjectShell() + // must not be used (see comment from MBA) + + SfxViewShell *pView = 0; + SwView *pSwView = 0; + SwPagePreview *pSwPagePreview = 0; + SwSrcView *pSwSrcView = 0; + SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDocShell, false ); + + // look for the view shell with the same controller in use, + // otherwise look for a suitable view, preferably a SwView, + // if that one is not found use a SwPagePreview if found. + while (pFrame) + { + pView = pFrame->GetViewShell(); + pSwView = dynamic_cast< SwView * >(pView); + pSwSrcView = dynamic_cast< SwSrcView * >(pView); + if (!pSwPagePreview) + pSwPagePreview = dynamic_cast< SwPagePreview * >(pView); + if (xController.is()) + { + if (pView && pView->GetController() == xController) + break; + } + else if (pSwView || pSwSrcView) + break; + pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell, false ); + } + + OSL_ENSURE( pSwView || pSwPagePreview || pSwSrcView, "failed to get view shell" ); + if (pView) + rbIsSwSrcView = pSwSrcView != 0; + return pView; +} + +void SAL_CALL SwXTextDocument::render( + sal_Int32 nRenderer, + const uno::Any& rSelection, + const uno::Sequence< beans::PropertyValue >& rxOptions ) + throw (IllegalArgumentException, RuntimeException, + std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + { + throw DisposedException( OUString(), + static_cast< XTextDocument* >(this) ); + } + + // due to #110067# (document page count changes sometimes during + // PDF export/printing) we can not check for the upper bound properly. + // Thus instead of throwing the exception we silently return. + if (0 > nRenderer) + throw IllegalArgumentException(); + + const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" ); + bool bIsSwSrcView = false; + SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport ); + + OSL_ENSURE( m_pRenderData, "data should have been created already in getRendererCount..." ); + OSL_ENSURE( m_pPrintUIOptions, "data should have been created already in getRendererCount..." ); + if (!bIsSwSrcView && !m_pRenderData) + m_pRenderData = new SwRenderData; + if (!m_pPrintUIOptions) + m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView ); + m_pPrintUIOptions->processProperties( rxOptions ); + const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); + const bool bLastPage = m_pPrintUIOptions->getBoolValue( "IsLastPage", false ); + + SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport ); + OSL_ENSURE( pDoc && pView, "doc or view shell missing!" ); + if (pDoc && pView) + { + sal_Int32 nMaxRenderer = 0; + if (!bIsSwSrcView) + { + OSL_ENSURE( m_pRenderData, "m_pRenderData missing!!" ); + nMaxRenderer = bPrintProspect? + m_pRenderData->GetPagePairsForProspectPrinting().size() - 1 : + m_pRenderData->GetPagesToPrint().size() - 1; + } + // since SwSrcView::PrintSource is a poor implementation to get the number of pages to print + // we obmit checking of the upper bound in this case. + if (bIsSwSrcView || nRenderer <= nMaxRenderer) + { + if (bIsSwSrcView) + { + SwSrcView *pSwSrcView = dynamic_cast< SwSrcView * >(pView); + OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); + pSwSrcView->PrintSource( pOutDev, nRenderer + 1, false ); + } + else + { + // the view shell should be SwView for documents PDF export + // or SwPagePreview for PDF export of the page preview + //!! (check for SwView first as in GuessViewShell) !! + OSL_ENSURE( pView, "!! view missing !!" ); + const TypeId aSwViewTypeId = TYPE(SwView); + SwViewShell* pVwSh = 0; + if (pView) + { + // TODO/mba: we really need a generic way to get the SwViewShell! + SwView* pSwView = PTR_CAST(SwView, pView); + if ( pSwView ) + pVwSh = pSwView->GetWrtShellPtr(); + else + pVwSh = ((SwPagePreview*)pView)->GetViewShell(); + } + + // get output device to use + OutputDevice * pOut = lcl_GetOutputDevice( *m_pPrintUIOptions ); + + if(pVwSh && pOut && m_pRenderData->HasSwPrtOptions()) + { + const OUString aPageRange = m_pPrintUIOptions->getStringValue( "PageRange", OUString() ); + const bool bFirstPage = m_pPrintUIOptions->getBoolValue( "IsFirstPage", false ); + bool bIsSkipEmptyPages = !m_pPrintUIOptions->IsPrintEmptyPages( bIsPDFExport ); + + OSL_ENSURE(( pView->IsA(aSwViewTypeId) && m_pRenderData->IsViewOptionAdjust()) + || (!pView->IsA(aSwViewTypeId) && !m_pRenderData->IsViewOptionAdjust()), + "SwView / SwViewOptionAdjust_Impl availability mismatch" ); + + // since printing now also use the API for PDF export this option + // should be set for printing as well ... + pVwSh->SetPDFExportOption( true ); + + // #i12836# enhanced pdf export + + // First, we have to export hyperlinks, notes, and outline to pdf. + // During this process, additional information required for tagging + // the pdf file are collected, which are evaulated during painting. + + SwWrtShell* pWrtShell = pView->IsA(aSwViewTypeId) ? + ((SwView*)pView)->GetWrtShellPtr() : + 0; + + SwPrintData const& rSwPrtOptions = + *m_pRenderData->GetSwPrtOptions(); + + if (bIsPDFExport && bFirstPage && pWrtShell) + { + SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPageRange, bIsSkipEmptyPages, false, rSwPrtOptions ); + } + + if (bPrintProspect) + pVwSh->PrintProspect( pOut, rSwPrtOptions, nRenderer ); + else // normal printing and PDF export + pVwSh->PrintOrPDFExport( pOut, rSwPrtOptions, nRenderer ); + + // #i35176# + + // After printing the last page, we take care for the links coming + // from the EditEngine. The links are generated during the painting + // process, but the destinations are still missing. + + if (bIsPDFExport && bLastPage && pWrtShell) + { + SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPageRange, bIsSkipEmptyPages, true, rSwPrtOptions ); + } + + pVwSh->SetPDFExportOption( false ); + + // last page to be rendered? (not necessarily the last page of the document) + // -> do clean-up of data + if (bLastPage) + { + // #i96167# haggai: delete ViewOptionsAdjust here because it makes use + // of the shell, which might get destroyed in lcl_DisposeView! + if (m_pRenderData->IsViewOptionAdjust()) + m_pRenderData->ViewOptionAdjustStop(); + + if (m_pRenderData->HasPostItData()) + m_pRenderData->DeletePostItData(); + if (m_pHiddenViewFrame) + { + lcl_DisposeView( m_pHiddenViewFrame, pDocShell ); + m_pHiddenViewFrame = 0; + + // prevent crash described in #i108805 + SwDocShell *pRenderDocShell = pDoc->GetDocShell(); + SfxItemSet *pSet = pRenderDocShell->GetMedium()->GetItemSet(); + pSet->Put( SfxBoolItem( SID_HIDDEN, false ) ); + + } + } + } + } + } + } + if( bLastPage ) + { + delete m_pRenderData; m_pRenderData = NULL; + delete m_pPrintUIOptions; m_pPrintUIOptions = NULL; + } +} + +// xforms::XFormsSupplier +Reference<XNameContainer> SAL_CALL SwXTextDocument::getXForms() + throw( RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if ( !pDocShell ) + throw DisposedException( OUString(), static_cast< XTextDocument* >( this ) ); + SwDoc* pDoc = pDocShell->GetDoc(); + return pDoc->getXForms(); +} + +uno::Reference< text::XFlatParagraphIterator > SAL_CALL SwXTextDocument::getFlatParagraphIterator(::sal_Int32 nTextMarkupType, sal_Bool bAutomatic) + throw ( uno::RuntimeException, std::exception ) +{ + SolarMutexGuard aGuard; + if (!IsValid()) + { + throw DisposedException("SwXTextDocument not valid", + static_cast<XTextDocument*>(this)); + } + + return SwUnoCursorHelper::CreateFlatParagraphIterator( + *pDocShell->GetDoc(), nTextMarkupType, bAutomatic); +} + +uno::Reference< util::XCloneable > SwXTextDocument::createClone( ) throw (uno::RuntimeException, std::exception) +{ + SolarMutexGuard aGuard; + if(!IsValid()) + throw RuntimeException(); + + // create a new document - hidden - copy the storage and return it + // SfxObjectShellRef is used here, since the model should control object lifetime after creation + // and thus SfxObjectShellLock is not allowed here + // the model holds reference to the shell, so the shell will not destructed at the end of method + SfxObjectShellRef pShell = pDocShell->GetDoc()->CreateCopy(false); + uno::Reference< frame::XModel > xNewModel = pShell->GetModel(); + uno::Reference< embed::XStorage > xNewStorage = ::comphelper::OStorageHelper::GetTemporaryStorage( ); + uno::Sequence< beans::PropertyValue > aTempMediaDescriptor; + storeToStorage( xNewStorage, aTempMediaDescriptor ); + uno::Reference< document::XStorageBasedDocument > xStorageDoc( xNewModel, uno::UNO_QUERY ); + xStorageDoc->loadFromStorage( xNewStorage, aTempMediaDescriptor ); + return uno::Reference< util::XCloneable >( xNewModel, UNO_QUERY ); +} + +void * SAL_CALL SwXTextDocument::operator new( size_t t) throw() +{ + return SwXTextDocumentBaseClass::operator new(t); +} + +void SAL_CALL SwXTextDocument::operator delete( void * p) throw() +{ + SwXTextDocumentBaseClass::operator delete(p); +} + +/** + * retrieve languages already used in current document + */ +uno::Sequence< lang::Locale > SAL_CALL SwXTextDocument::getDocumentLanguages( + ::sal_Int16 nScriptTypes, + ::sal_Int16 nMaxCount ) + throw (lang::IllegalArgumentException, + uno::RuntimeException, + std::exception) +{ + SolarMutexGuard aGuard; + + // possible canonical values for nScriptTypes + // any bit wise combination is allowed + const sal_Int16 nLatin = 0x001; + const sal_Int16 nAsian = 0x002; + const sal_Int16 nComplex = 0x004; + + // script types for which to get the languages + const bool bLatin = 0 != (nScriptTypes & nLatin); + const bool bAsian = 0 != (nScriptTypes & nAsian); + const bool bComplex = 0 != (nScriptTypes & nComplex); + + if (nScriptTypes < nLatin || nScriptTypes > (nLatin | nAsian | nComplex)) + throw IllegalArgumentException("nScriptTypes ranges from 1 to 7!", Reference< XInterface >(), 1); + if (!pDocShell) + throw DisposedException(); + SwDoc* pDoc = pDocShell->GetDoc(); + + // avoid duplicate values + std::set< LanguageType > aAllLangs; + + //USER STYLES + + const SwCharFmts *pFmts = pDoc->GetCharFmts(); + for(sal_uInt16 i = 0; i < pFmts->size(); ++i) + { + const SwAttrSet &rAttrSet = (*pFmts)[i]->GetAttrSet(); + LanguageType nLang = LANGUAGE_DONTKNOW; + if (bLatin) + { + nLang = rAttrSet.GetLanguage( false ).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bAsian) + { + nLang = rAttrSet.GetCJKLanguage( false ).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bComplex) + { + nLang = rAttrSet.GetCTLLanguage( false ).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + } + + const SwTxtFmtColls *pColls = pDoc->GetTxtFmtColls(); + for (sal_uInt16 i = 0; i < pColls->size(); ++i) + { + const SwAttrSet &rAttrSet = (*pColls)[i]->GetAttrSet(); + LanguageType nLang = LANGUAGE_DONTKNOW; + if (bLatin) + { + nLang = rAttrSet.GetLanguage( false ).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bAsian) + { + nLang = rAttrSet.GetCJKLanguage( false ).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bComplex) + { + nLang = rAttrSet.GetCTLLanguage( false ).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + } + + //AUTO STYLES + const IStyleAccess::SwAutoStyleFamily aFam[2] = + { + IStyleAccess::AUTO_STYLE_CHAR, + IStyleAccess::AUTO_STYLE_PARA + }; + for (sal_uInt16 i = 0; i < 2; ++i) + { + std::vector< SfxItemSet_Pointer_t > rStyles; + pDoc->GetIStyleAccess().getAllStyles(rStyles, aFam[i]); + while (!rStyles.empty()) + { + SfxItemSet_Pointer_t pStyle = rStyles.back(); + rStyles.pop_back(); + const SfxItemSet *pSet = dynamic_cast< const SfxItemSet * >(pStyle.get()); + + LanguageType nLang = LANGUAGE_DONTKNOW; + if (bLatin) + { + nLang = dynamic_cast< const SvxLanguageItem & >(pSet->Get( RES_CHRATR_LANGUAGE, false )).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bAsian) + { + nLang = dynamic_cast< const SvxLanguageItem & >(pSet->Get( RES_CHRATR_CJK_LANGUAGE, false )).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bComplex) + { + nLang = dynamic_cast< const SvxLanguageItem & >(pSet->Get( RES_CHRATR_CTL_LANGUAGE, false )).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + } + } + + //TODO/mba: it's a strange concept that a view is needed to retrieve core data + SwWrtShell *pWrtSh = pDocShell->GetWrtShell(); + SdrView *pSdrView = pWrtSh->GetDrawView(); + + if( pSdrView ) + { + SdrOutliner* pOutliner = pSdrView->GetTextEditOutliner(); + if(pOutliner) + { + EditEngine& rEditEng = (EditEngine&)pOutliner->GetEditEngine(); + sal_Int32 nParCount = pOutliner->GetParagraphCount(); + for (sal_Int32 nPar=0; nPar<nParCount; nPar++) + { + //every paragraph + std::vector<sal_Int32> aPortions; + rEditEng.GetPortions( nPar, aPortions ); + + for ( size_t nPos = aPortions.size(); nPos; ) + { + //every position + --nPos; + sal_Int32 nEnd = aPortions[ nPos ]; + sal_Int32 nStart = nPos ? aPortions[ nPos - 1 ] : 0; + ESelection aSelection( nPar, nStart, nPar, nEnd ); + SfxItemSet aAttr = rEditEng.GetAttribs( aSelection ); + + LanguageType nLang = LANGUAGE_DONTKNOW; + if (bLatin) + { + nLang = dynamic_cast< const SvxLanguageItem & >(aAttr.Get( EE_CHAR_LANGUAGE, false )).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bAsian) + { + nLang = dynamic_cast< const SvxLanguageItem & >(aAttr.Get( EE_CHAR_LANGUAGE_CJK, false )).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + if (bComplex) + { + nLang = dynamic_cast< const SvxLanguageItem & >(aAttr.Get( EE_CHAR_LANGUAGE_CTL, false )).GetLanguage(); + if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM) + aAllLangs.insert( nLang ); + } + } + } + } + } + // less than nMaxCount languages + if (nMaxCount > static_cast< sal_Int16 >( aAllLangs.size() )) + nMaxCount = static_cast< sal_Int16 >( aAllLangs.size() ); + + // build return value + uno::Sequence< lang::Locale > aLanguages( nMaxCount ); + lang::Locale* pLanguage = aLanguages.getArray(); + if (nMaxCount > 0) + { + sal_Int32 nCount = 0; + for (std::set< LanguageType >::const_iterator it = aAllLangs.begin(); it != aAllLangs.end(); ++it) + { + if (nCount >= nMaxCount) + break; + if (LANGUAGE_NONE != *it) + { + pLanguage[nCount] = LanguageTag::convertToLocale( *it ); + pLanguage[nCount].Language = SvtLanguageTable::GetLanguageString( *it ); + nCount += 1; + } + } + } + + return aLanguages; +} + +SwXLinkTargetSupplier::SwXLinkTargetSupplier(SwXTextDocument& rxDoc) : + pxDoc(&rxDoc) +{ + sTables = SW_RES(STR_CONTENT_TYPE_TABLE); + sFrames = SW_RES(STR_CONTENT_TYPE_FRAME); + sGraphics = SW_RES(STR_CONTENT_TYPE_GRAPHIC); + sOLEs = SW_RES(STR_CONTENT_TYPE_OLE); + sSections = SW_RES(STR_CONTENT_TYPE_REGION); + sOutlines = SW_RES(STR_CONTENT_TYPE_OUTLINE); + sBookmarks = SW_RES(STR_CONTENT_TYPE_BOOKMARK); +} + +SwXLinkTargetSupplier::~SwXLinkTargetSupplier() +{ +} + +Any SwXLinkTargetSupplier::getByName(const OUString& rName) + throw( NoSuchElementException, WrappedTargetException, RuntimeException, std::exception ) +{ + Any aRet; + if(!pxDoc) + throw RuntimeException(); + OUString sToCompare(rName); + OUString sSuffix("|"); + if(sToCompare == sTables) + { + sSuffix += "table"; + + Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper( + pxDoc->getTextTables(), sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xTbls, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else if(sToCompare == sFrames) + { + sSuffix += "frame"; + Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper( + pxDoc->getTextFrames(), sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xTbls, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else if(sToCompare == sSections) + { + sSuffix += "region"; + Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper( + pxDoc->getTextSections(), sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xTbls, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else if(sToCompare == sGraphics) + { + sSuffix += "graphic"; + Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper( + pxDoc->getGraphicObjects(), sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xTbls, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else if(sToCompare == sOLEs) + { + sSuffix += "ole"; + Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper( + pxDoc->getEmbeddedObjects(), sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xTbls, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else if(sToCompare == sOutlines) + { + sSuffix += "outline"; + Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper( + *pxDoc, sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xTbls, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else if(sToCompare == sBookmarks) + { + sSuffix = ""; + Reference< XNameAccess > xBkms = new SwXLinkNameAccessWrapper( + pxDoc->getBookmarks(), sToCompare, sSuffix ); + Reference< XPropertySet > xRet(xBkms, UNO_QUERY); + aRet.setValue(&xRet, cppu::UnoType<XPropertySet>::get()); + } + else + throw NoSuchElementException(); + return aRet; +} + +Sequence< OUString > SwXLinkTargetSupplier::getElementNames(void) + throw( RuntimeException, std::exception ) +{ + Sequence< OUString > aRet(7); + OUString* pNames = aRet.getArray(); + pNames[0] = sTables; + pNames[1] = sFrames ; + pNames[2] = sGraphics; + pNames[3] = sOLEs ; + pNames[4] = sSections; + pNames[5] = sOutlines; + pNames[6] = sBookmarks; + return aRet; +} + +sal_Bool SwXLinkTargetSupplier::hasByName(const OUString& rName) + throw( RuntimeException, std::exception ) +{ + OUString sToCompare(rName); + if( sToCompare == sTables || + sToCompare == sFrames || + sToCompare == sGraphics|| + sToCompare == sOLEs || + sToCompare == sSections || + sToCompare == sOutlines || + sToCompare == sBookmarks ) + return sal_True; + return sal_False; +} + +uno::Type SwXLinkTargetSupplier::getElementType(void) + throw( RuntimeException, std::exception ) +{ + return cppu::UnoType<XPropertySet>::get(); + +} + +sal_Bool SwXLinkTargetSupplier::hasElements(void) throw( RuntimeException, std::exception ) +{ + return 0 != pxDoc; +} + +OUString SwXLinkTargetSupplier::getImplementationName(void) throw( RuntimeException, std::exception ) +{ + return OUString("SwXLinkTargetSupplier"); +} + +sal_Bool SwXLinkTargetSupplier::supportsService(const OUString& rServiceName) + throw( RuntimeException, std::exception ) +{ + return cppu::supportsService(this, rServiceName); +} + +Sequence< OUString > SwXLinkTargetSupplier::getSupportedServiceNames(void) + throw( RuntimeException, std::exception ) +{ + Sequence< OUString > aRet(1); + OUString* pNames = aRet.getArray(); + pNames[0] = "com.sun.star.document.LinkTargets"; + return aRet; +} + +SwXLinkNameAccessWrapper::SwXLinkNameAccessWrapper( + Reference< XNameAccess > xAccess, const OUString& rLinkDisplayName, const OUString& sSuffix ) : + xRealAccess(xAccess), + pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_LINK_TARGET)), + sLinkSuffix(sSuffix), + sLinkDisplayName(rLinkDisplayName), + pxDoc(0) +{ +} + +SwXLinkNameAccessWrapper::SwXLinkNameAccessWrapper(SwXTextDocument& rxDoc, + const OUString& rLinkDisplayName, const OUString& sSuffix) : + pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_LINK_TARGET)), + sLinkSuffix(sSuffix), + sLinkDisplayName(rLinkDisplayName), + xDoc(&rxDoc), + pxDoc(&rxDoc) +{ +} + +SwXLinkNameAccessWrapper::~SwXLinkNameAccessWrapper() +{ +} + +Any SwXLinkNameAccessWrapper::getByName(const OUString& rName) + throw( NoSuchElementException, WrappedTargetException, RuntimeException, std::exception ) +{ + Any aRet; + bool bFound = false; + //cut link extension and call the real NameAccess + OUString sParam = rName; + OUString sSuffix(sLinkSuffix); + if(sParam.getLength() > sSuffix.getLength() ) + { + OUString sCmp = sParam.copy(sParam.getLength() - sSuffix.getLength(), + sSuffix.getLength()); + if(sCmp == sSuffix) + { + if(pxDoc) + { + sParam = sParam.copy(0, sParam.getLength() - sSuffix.getLength()); + if(!pxDoc->GetDocShell()) + throw RuntimeException(); + SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc(); + sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().size(); + + for (sal_uInt16 i = 0; i < nOutlineCount && !bFound; ++i) + { + const SwOutlineNodes& rOutlineNodes = pDoc->GetNodes().GetOutLineNds(); + const SwNumRule* pOutlRule = pDoc->GetOutlineNumRule(); + if(sParam == + lcl_CreateOutlineString(i, rOutlineNodes, pOutlRule)) + { + Reference< XPropertySet > xOutline = new SwXOutlineTarget(sParam); + aRet.setValue(&xOutline, cppu::UnoType<XPropertySet>::get()); + bFound = true; + } + } + } + else + { + aRet = xRealAccess->getByName(sParam.copy(0, sParam.getLength() - sSuffix.getLength())); + Reference< XInterface > xInt; + if(!(aRet >>= xInt)) + throw RuntimeException(); + Reference< XPropertySet > xProp(xInt, UNO_QUERY); + aRet <<= xProp; + bFound = true; + } + } + } + if(!bFound) + throw NoSuchElementException(); + return aRet; +} + +Sequence< OUString > SwXLinkNameAccessWrapper::getElementNames(void) + throw( RuntimeException, std::exception ) +{ + Sequence< OUString > aRet; + if(pxDoc) + { + if(!pxDoc->GetDocShell()) + throw RuntimeException(); + + SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc(); + const SwOutlineNodes& rOutlineNodes = pDoc->GetNodes().GetOutLineNds(); + sal_uInt16 nOutlineCount = rOutlineNodes.size(); + aRet.realloc(nOutlineCount); + OUString* pResArr = aRet.getArray(); + OUString sSuffix("|outline"); + const SwNumRule* pOutlRule = pDoc->GetOutlineNumRule(); + for (sal_uInt16 i = 0; i < nOutlineCount; ++i) + { + OUString sEntry = lcl_CreateOutlineString(i, rOutlineNodes, pOutlRule); + sEntry += sSuffix; + pResArr[i] = sEntry; + } + } + else + { + Sequence< OUString > aOrg = xRealAccess->getElementNames(); + const OUString* pOrgArr = aOrg.getConstArray(); + aRet.realloc(aOrg.getLength()); + OUString* pResArr = aRet.getArray(); + for(long i = 0; i < aOrg.getLength(); i++) + { + pResArr[i] = pOrgArr[i] + sLinkSuffix; + } + } + return aRet; +} + +sal_Bool SwXLinkNameAccessWrapper::hasByName(const OUString& rName) + throw( RuntimeException, std::exception ) +{ + bool bRet = false; + OUString sParam(rName); + if(sParam.getLength() > sLinkSuffix.getLength() ) + { + OUString sCmp = sParam.copy(sParam.getLength() - sLinkSuffix.getLength(), + sLinkSuffix.getLength()); + if(sCmp == sLinkSuffix) + { + sParam = sParam.copy(0, sParam.getLength() - sLinkSuffix.getLength()); + if(pxDoc) + { + if(!pxDoc->GetDocShell()) + throw RuntimeException(); + SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc(); + sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().size(); + + for (sal_uInt16 i = 0; i < nOutlineCount && !bRet; ++i) + { + const SwOutlineNodes& rOutlineNodes = pDoc->GetNodes().GetOutLineNds(); + const SwNumRule* pOutlRule = pDoc->GetOutlineNumRule(); + if(sParam == + lcl_CreateOutlineString(i, rOutlineNodes, pOutlRule)) + { + bRet = true; + } + } + } + else + { + bRet = xRealAccess->hasByName(sParam); + } + } + } + return bRet; +} + +uno::Type SwXLinkNameAccessWrapper::getElementType(void) + throw( RuntimeException, std::exception ) +{ + return cppu::UnoType<XPropertySet>::get(); +} + +sal_Bool SwXLinkNameAccessWrapper::hasElements(void) throw( RuntimeException, std::exception ) +{ + bool bRet = false; + if(pxDoc) + { + OSL_FAIL("not implemented"); + } + else + { + bRet = xRealAccess->hasElements(); + } + return bRet; +} + +Reference< XPropertySetInfo > SwXLinkNameAccessWrapper::getPropertySetInfo(void) + throw( RuntimeException, std::exception ) +{ + static Reference< XPropertySetInfo > xRet = pPropSet->getPropertySetInfo(); + return xRet; +} + +void SwXLinkNameAccessWrapper::setPropertyValue( + const OUString& , const Any& ) + throw( UnknownPropertyException, + PropertyVetoException, + IllegalArgumentException, + WrappedTargetException, + RuntimeException, std::exception) +{ + throw UnknownPropertyException(); +} + +static Any lcl_GetDisplayBitmap(const OUString& _sLinkSuffix) +{ + Any aRet; + OUString sLinkSuffix = _sLinkSuffix; + if(!sLinkSuffix.isEmpty()) + sLinkSuffix = sLinkSuffix.copy(1); + sal_uInt16 nImgId = USHRT_MAX; + + if(sLinkSuffix == "outline") + nImgId = CONTENT_TYPE_OUTLINE; + else if(sLinkSuffix == "table") + nImgId = CONTENT_TYPE_TABLE; + else if(sLinkSuffix == "frame") + nImgId = CONTENT_TYPE_FRAME; + else if(sLinkSuffix == "graphic") + nImgId = CONTENT_TYPE_GRAPHIC; + else if(sLinkSuffix == "region") + nImgId = CONTENT_TYPE_REGION; + else if(sLinkSuffix == "ole") + nImgId = CONTENT_TYPE_OLE; + else if(sLinkSuffix.isEmpty()) + nImgId = CONTENT_TYPE_BOOKMARK; + if(USHRT_MAX != nImgId) + { + nImgId += 20000; + ImageList aEntryImages( SW_RES(IMG_NAVI_ENTRYBMP) ); + const Image& rImage = aEntryImages.GetImage( nImgId ); + Bitmap aBitmap( rImage.GetBitmapEx().GetBitmap() ); + Reference<awt::XBitmap> xBmp = VCLUnoHelper::CreateBitmap( aBitmap ); + aRet.setValue( &xBmp, cppu::UnoType<awt::XBitmap>::get()); + } + return aRet; +} + +Any SwXLinkNameAccessWrapper::getPropertyValue(const OUString& rPropertyName) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + Any aRet; + if( rPropertyName == UNO_LINK_DISPLAY_NAME ) + { + aRet <<= OUString(sLinkDisplayName); + } + else if( rPropertyName == UNO_LINK_DISPLAY_BITMAP ) + { + aRet = lcl_GetDisplayBitmap(sLinkSuffix); + } + else + throw UnknownPropertyException(); + return aRet; +} + +void SwXLinkNameAccessWrapper::addPropertyChangeListener( + const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{} + +void SwXLinkNameAccessWrapper::removePropertyChangeListener( + const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{} + +void SwXLinkNameAccessWrapper::addVetoableChangeListener( + const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{} + +void SwXLinkNameAccessWrapper::removeVetoableChangeListener( + const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{} + +Reference< XNameAccess > SwXLinkNameAccessWrapper::getLinks(void) + throw( RuntimeException, std::exception ) +{ + return (SwXLinkNameAccessWrapper*)this; +} + +OUString SwXLinkNameAccessWrapper::getImplementationName(void) throw( RuntimeException, std::exception ) +{ + return OUString("SwXLinkNameAccessWrapper"); +} + +sal_Bool SwXLinkNameAccessWrapper::supportsService(const OUString& rServiceName) + throw( RuntimeException, std::exception ) +{ + return cppu::supportsService(this, rServiceName); +} + +Sequence< OUString > SwXLinkNameAccessWrapper::getSupportedServiceNames(void) + throw( RuntimeException, std::exception ) +{ + Sequence< OUString > aRet(1); + OUString* pNames = aRet.getArray(); + pNames[0] = "com.sun.star.document.LinkTargets"; + return aRet; +} + +SwXOutlineTarget::SwXOutlineTarget(const OUString& rOutlineText) : + pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_LINK_TARGET)), + sOutlineText(rOutlineText) +{ +} + +SwXOutlineTarget::~SwXOutlineTarget() +{ +} + +Reference< XPropertySetInfo > SwXOutlineTarget::getPropertySetInfo(void) throw( RuntimeException, std::exception ) +{ + static Reference< XPropertySetInfo > xRet = pPropSet->getPropertySetInfo(); + return xRet; +} + +void SwXOutlineTarget::setPropertyValue( + const OUString& /*PropertyName*/, const Any& /*aValue*/) + throw( UnknownPropertyException, PropertyVetoException, + IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception) +{ + throw UnknownPropertyException(); +} + +Any SwXOutlineTarget::getPropertyValue(const OUString& rPropertyName) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ + Any aRet; + if(rPropertyName == UNO_LINK_DISPLAY_NAME) + aRet <<= OUString(sOutlineText); + else + throw UnknownPropertyException(); + return aRet; +} + +void SwXOutlineTarget::addPropertyChangeListener( + const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ +} + +void SwXOutlineTarget::removePropertyChangeListener( + const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ +} + +void SwXOutlineTarget::addVetoableChangeListener( + const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ +} + +void SwXOutlineTarget::removeVetoableChangeListener( + const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/) + throw( UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception ) +{ +} + +OUString SwXOutlineTarget::getImplementationName(void) throw( RuntimeException, std::exception ) +{ + return OUString("SwXOutlineTarget"); +} + +sal_Bool SwXOutlineTarget::supportsService(const OUString& ServiceName) throw( RuntimeException, std::exception ) +{ + return cppu::supportsService(this, ServiceName); +} + +Sequence< OUString > SwXOutlineTarget::getSupportedServiceNames(void) throw( RuntimeException, std::exception ) +{ + Sequence < OUString > aRet(1); + OUString* pArray = aRet.getArray(); + pArray[0] = "com.sun.star.document.LinkTarget"; + + return aRet; +} + +SwXDocumentPropertyHelper::SwXDocumentPropertyHelper(SwDoc& rDoc) : +SvxUnoForbiddenCharsTable ( rDoc.getForbiddenCharacterTable() ) +,m_pDoc(&rDoc) +{ +} + +SwXDocumentPropertyHelper::~SwXDocumentPropertyHelper() +{ +} + +Reference<XInterface> SwXDocumentPropertyHelper::GetDrawTable(short nWhich) +{ + Reference<XInterface> xRet; + if(m_pDoc) + { + switch(nWhich) + { + // #i52858# + // assure that Draw model is created, if it doesn't exist. + case SW_CREATE_DASH_TABLE : + if(!xDashTable.is()) + xDashTable = SvxUnoDashTable_createInstance( m_pDoc->GetOrCreateDrawModel() ); + xRet = xDashTable; + break; + case SW_CREATE_GRADIENT_TABLE : + if(!xGradientTable.is()) + xGradientTable = SvxUnoGradientTable_createInstance( m_pDoc->GetOrCreateDrawModel() ); + xRet = xGradientTable; + break; + case SW_CREATE_HATCH_TABLE : + if(!xHatchTable.is()) + xHatchTable = SvxUnoHatchTable_createInstance( m_pDoc->GetOrCreateDrawModel() ); + xRet = xHatchTable; + break; + case SW_CREATE_BITMAP_TABLE : + if(!xBitmapTable.is()) + xBitmapTable = SvxUnoBitmapTable_createInstance( m_pDoc->GetOrCreateDrawModel() ); + xRet = xBitmapTable; + break; + case SW_CREATE_TRANSGRADIENT_TABLE: + if(!xTransGradientTable.is()) + xTransGradientTable = SvxUnoTransGradientTable_createInstance( m_pDoc->GetOrCreateDrawModel() ); + xRet = xTransGradientTable; + break; + case SW_CREATE_MARKER_TABLE : + if(!xMarkerTable.is()) + xMarkerTable = SvxUnoMarkerTable_createInstance( m_pDoc->GetOrCreateDrawModel() ); + xRet = xMarkerTable; + break; + case SW_CREATE_DRAW_DEFAULTS: + if(!xDrawDefaults.is()) + xDrawDefaults = (cppu::OWeakObject*)new SwSvxUnoDrawPool(m_pDoc); + xRet = xDrawDefaults; + break; +#if OSL_DEBUG_LEVEL > 0 + default: OSL_FAIL("which table?"); +#endif + } + } + return xRet; +} + +void SwXDocumentPropertyHelper::Invalidate() +{ + xDashTable = 0; + xGradientTable = 0; + xHatchTable = 0; + xBitmapTable = 0; + xTransGradientTable = 0; + xMarkerTable = 0; + xDrawDefaults = 0; + m_pDoc = 0; + SvxUnoForbiddenCharsTable::mxForbiddenChars.clear(); +} + +void SwXDocumentPropertyHelper::onChange() +{ + if(m_pDoc) + m_pDoc->SetModified(); +} + +SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl( + SwViewShell& rSh, const SwViewOption &rViewOptions) + : m_pShell(&rSh) + , m_aOldViewOptions( rViewOptions ) +{ +} + +SwViewOptionAdjust_Impl::~SwViewOptionAdjust_Impl() +{ + if (m_pShell) + { + m_pShell->ApplyViewOptions( m_aOldViewOptions ); + } +} + +void +SwViewOptionAdjust_Impl::AdjustViewOptions(SwPrintData const*const pPrtOptions) +{ + // to avoid unnecessary reformatting the view options related to the content + // below should only change if necessary, that is if respective content is present + const bool bContainsHiddenChars = m_pShell->GetDoc()->ContainsHiddenChars(); + const SwFieldType* pFldType = m_pShell->GetDoc()->GetSysFldType( RES_HIDDENTXTFLD ); + const bool bContainsHiddenFields = pFldType && pFldType->GetDepends(); + pFldType = m_pShell->GetDoc()->GetSysFldType( RES_HIDDENPARAFLD ); + const bool bContainsHiddenParagraphs = pFldType && pFldType->GetDepends(); + pFldType = m_pShell->GetDoc()->GetSysFldType( RES_JUMPEDITFLD ); + const bool bContainsPlaceHolders = pFldType && pFldType->GetDepends(); + const bool bContainsFields = m_pShell->IsAnyFieldInDoc(); + + SwViewOption aRenderViewOptions( m_aOldViewOptions ); + + // disable anything in the view that should not be printed (or exported to PDF) by default + // (see also dialog "Tools/Options - StarOffice Writer - Formatting Aids" + // in section "Display of ...") + aRenderViewOptions.SetParagraph( false ); // paragraph end + aRenderViewOptions.SetSoftHyph( false ); // aka custom hyphens + aRenderViewOptions.SetBlank( false ); // spaces + aRenderViewOptions.SetHardBlank( false ); // non-breaking spaces + aRenderViewOptions.SetTab( false ); // tabs + aRenderViewOptions.SetLineBreak( false ); // breaks (type 1) + aRenderViewOptions.SetPageBreak( false ); // breaks (type 2) + aRenderViewOptions.SetColumnBreak( false ); // breaks (type 3) + bool bVal = pPrtOptions? pPrtOptions->bPrintHiddenText : sal_False; + if (bContainsHiddenChars) + aRenderViewOptions.SetShowHiddenChar( bVal ); // hidden text + if (bContainsHiddenFields) + aRenderViewOptions.SetShowHiddenField( bVal ); + if (bContainsHiddenParagraphs) + aRenderViewOptions.SetShowHiddenPara( bVal ); + + if (bContainsPlaceHolders) + { + // should always be printed in PDF export! + bVal = pPrtOptions ? pPrtOptions->bPrintTextPlaceholder : sal_True; + aRenderViewOptions.SetShowPlaceHolderFields( bVal ); + } + + if (bContainsFields) + aRenderViewOptions.SetFldName( false ); + + // we need to set this flag in order to get to see the visible effect of + // some of the above settings (needed for correct rendering) + aRenderViewOptions.SetViewMetaChars( true ); + + if (m_aOldViewOptions != aRenderViewOptions) // check if reformatting is necessary + { + aRenderViewOptions.SetPrinting( pPrtOptions != NULL ); + m_pShell->ApplyViewOptions( aRenderViewOptions ); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |