blob: 6831c1dd722c0655f77684a6735b94081ccf3e7d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <vos/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 <view.hxx>
#include <pview.hxx>
#include <srcview.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> // SfxObjectShellRef <-> SV_DECL_REF(SfxObjectShell)
#include <unoprnms.hxx>
#include <unostyle.hxx>
#include <unodraw.hxx>
#include <svl/eitem.hxx>
#include <pagedesc.hxx>
#include <svtools/txtcmp.hxx>
#include <unocrsr.hxx>
#include <unofield.hxx>
#include <unoidx.hxx>
#include <unoflatpara.hxx>
#include <unotxvw.hxx>
#include <poolfmt.hxx>
#include <globdoc.hxx>
#include <viewopt.hxx>
#include <unochart.hxx>
#include <doc.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 <com/sun/star/reflection/XIdlClassProvider.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>
// --> FME 2004-06-08 #i12836# enhanced pdf export
#include <EnhancedPDFExportHelper.hxx>
// <--
#include <numrule.hxx>
///////////////////////////Modified on Jun. 14th//////////////////////////
///////////////////////for getDocumentLanguages///////////////////////////
//-->
#include <editeng/langitem.hxx>
#include <doc.hxx>
#include <docary.hxx> //SwCharFmts
#include <i18npool/mslangid.hxx>
#include <format.hxx>
#include <charfmt.hxx> //SwCharFmt
#include <fmtcol.hxx> //SwTxtFmtColl
#include <unostyle.hxx> //SwAutoStyleFamily
#include <istyleaccess.hxx> // handling of automatic styles
#include <svl/stylepool.hxx>
#include <swatrset.hxx>
#include <view.hxx>
#include <srcview.hxx>
//#include <com/sun/star/i18n/ScriptType.hpp>
#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>
//
//<--
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 namespace ::com::sun::star::i18n;
using ::rtl::OUString;
using ::osl::FileBase;
/* -----------------------------17.01.01 15:43--------------------------------
---------------------------------------------------------------------------*/
#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
/******************************************************************************
*
******************************************************************************/
extern bool lcl_GetPostIts( IDocumentFieldsAccess* pIDFA, _SetGetExpFlds * pSrtLst );
SwPrintUIOptions * lcl_GetPrintUIOptions(
SwDocShell * pDocShell,
const SfxViewShell * pView )
{
if (!pDocShell)
return NULL;
const sal_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( sal_False ) : false; // check for any selection, not just text selection
const bool bHasPostIts = lcl_GetPostIts( pDocShell->GetDoc(), 0 );
// get default values to use in dialog from documents SwPrintData
const SwPrintData &rPrintData = pDocShell->GetDoc()->getPrintData();
return new SwPrintUIOptions( bWebDoc, bSwSrcView, bHasSelection, bHasPostIts, rPrintData );
}
////////////////////////////////////////////////////////////
SwTxtFmtColl *lcl_GetParaStyle(const String& 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;
}
void lcl_DisposeView( SfxViewFrame* pToClose, SwDocShell* pDocShell )
{
// check if the view frame still exists
SfxViewFrame* pFound = SfxViewFrame::GetFirst( pDocShell,
sal_False );
while(pFound)
{
if( pFound == pToClose)
{
pToClose->DoClose();
break;
}
pFound = SfxViewFrame::GetNext( *pFound,
pDocShell,
sal_False );
}
}
/* -----------------------------10.03.00 18:02--------------------------------
---------------------------------------------------------------------------*/
const Sequence< sal_Int8 > & SwXTextDocument::getUnoTunnelId()
{
static Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
return aSeq;
}
/* -----------------------------10.03.00 18:04--------------------------------
---------------------------------------------------------------------------*/
sal_Int64 SAL_CALL SwXTextDocument::getSomething( const Sequence< sal_Int8 >& rId )
throw(RuntimeException)
{
if( rId.getLength() == 16
&& 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
rId.getConstArray(), 16 ) )
{
return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >( this ));
}
sal_Int64 nRet = SfxBaseModel::getSomething( rId );
if ( nRet )
return nRet;
else
{
GetNumberFormatter();
Any aNumTunnel = xNumFmtAgg->queryAggregation(::getCppuType((Reference<XUnoTunnel>*)0));
Reference<XUnoTunnel> xNumTunnel;
aNumTunnel >>= xNumTunnel;
if(xNumTunnel.is())
return xNumTunnel->getSomething(rId);
}
return SfxBaseModel::getSomething( rId );
}
/* -----------------------------16.03.00 14:12--------------------------------
---------------------------------------------------------------------------*/
Any SAL_CALL SwXTextDocument::queryInterface( const uno::Type& rType ) throw(RuntimeException)
{
Any aRet = SwXTextDocumentBaseClass::queryInterface(rType);
if ( !aRet.hasValue() )
aRet = SfxBaseModel::queryInterface(rType);
if ( !aRet.hasValue() &&
rType == ::getCppuType((Reference<lang::XMultiServiceFactory>*)0))
{
Reference<lang::XMultiServiceFactory> xTmp = this;
aRet <<= xTmp;
}
if ( !aRet.hasValue()
&& rType != ::getCppuType((Reference< com::sun::star::document::XDocumentEventBroadcaster>*)0)
&& rType != ::getCppuType((Reference< com::sun::star::frame::XController>*)0)
&& rType != ::getCppuType((Reference< com::sun::star::frame::XFrame>*)0)
&& rType != ::getCppuType((Reference< com::sun::star::script::XInvocation>*)0)
&& rType != ::getCppuType((Reference< com::sun::star::reflection::XIdlClassProvider>*)0)
&& rType != ::getCppuType((Reference< com::sun::star::beans::XFastPropertySet>*)0)
&& rType != ::getCppuType((Reference< com::sun::star::awt::XWindow>*)0))
{
GetNumberFormatter();
if(xNumFmtAgg.is())
aRet = xNumFmtAgg->queryAggregation(rType);
}
return aRet;
}
/* -----------------------------16.03.00 14:12--------------------------------
---------------------------------------------------------------------------*/
void SAL_CALL SwXTextDocument::acquire()throw()
{
SfxBaseModel::acquire();
}
/* -----------------------------16.03.00 14:12--------------------------------
---------------------------------------------------------------------------*/
void SAL_CALL SwXTextDocument::release()throw()
{
SfxBaseModel::release();
}
/* -----------------------------07.12.00 11:37--------------------------------
---------------------------------------------------------------------------*/
Reference< XAdapter > SwXTextDocument::queryAdapter( ) throw(RuntimeException)
{
return SfxBaseModel::queryAdapter();
}
/* -----------------------------16.03.00 14:12--------------------------------
---------------------------------------------------------------------------*/
Sequence< uno::Type > SAL_CALL SwXTextDocument::getTypes() throw(RuntimeException)
{
Sequence< uno::Type > aBaseTypes = SfxBaseModel::getTypes();
Sequence< uno::Type > aTextTypes = SwXTextDocumentBaseClass::getTypes();
Sequence< uno::Type > aNumTypes;
GetNumberFormatter();
if(xNumFmtAgg.is())
{
const uno::Type& rProvType = ::getCppuType((Reference <XTypeProvider>*)0);
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++] = ::getCppuType((Reference<lang::XMultiServiceFactory>*)0);
return aBaseTypes;
}
/*-- 18.12.98 11:52:59---------------------------------------------------
-----------------------------------------------------------------------*/
SwXTextDocument::SwXTextDocument(SwDocShell* pShell) :
SfxBaseModel(pShell),
aRefreshCont ( static_cast < XTextDocument* > ( this ) ),
pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_DOCUMENT)),
pDocShell(pShell),
bObjectValid(pShell != 0),
pDrawPage(0),
pxXDrawPage(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),
m_pPrintUIOptions( NULL ),
m_pRenderData( NULL ),
// --> OD #i117783#
bApplyPagePrintSettingsFromXPagePrintable( sal_False )
// <--
{
}
/*-- 18.12.98 11:53:00---------------------------------------------------
-----------------------------------------------------------------------*/
SwXTextDocument::~SwXTextDocument()
{
InitNewDoc();
if(xNumFmtAgg.is())
{
Reference< XInterface > x0;
xNumFmtAgg->setDelegator(x0);
xNumFmtAgg = 0;
}
delete m_pPrintUIOptions;
delete m_pRenderData;
}
/*-- 18.12.98 11:55:08---------------------------------------------------
-----------------------------------------------------------------------*/
/* -----------------18.12.98 12:49-------------------
*
* --------------------------------------------------*/
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( sal_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 = ::getCppuType((Reference <XUnoTunnel>*)0);
Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType);
SvNumberFormatsSupplierObj* pNumFmt = 0;
Reference< XUnoTunnel > xNumTunnel;
if(aNumTunnel >>= xNumTunnel)
{
pNumFmt = reinterpret_cast<SvNumberFormatsSupplierObj*>(
xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId()));
}
DBG_ASSERT(pNumFmt, "No number formatter available");
if(!pNumFmt->GetNumberFormatter())
pNumFmt->SetNumberFormatter(pDocShell->GetDoc()->GetNumberFormatter( sal_True ));
}
}
}
/*-- 18.12.98 11:55:11---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XText > SwXTextDocument::getText(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!xBodyText.is())
{
pBodyText = new SwXBodyText(pDocShell->GetDoc());
xBodyText = pBodyText;
}
return xBodyText;
}
/*-- 18.12.98 11:55:11---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::reformat(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
}
/*-- 18.12.98 11:55:16---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::lockControllers(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(IsValid())
{
UnoActionContext* pContext = new UnoActionContext(pDocShell->GetDoc());
aActionArr.Insert(pContext, 0);
}
else
throw RuntimeException();
}
/*-- 18.12.98 11:55:16---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::unlockControllers(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(aActionArr.Count())
{
UnoActionContext* pContext = aActionArr.GetObject(0);
aActionArr.Remove(0);
delete pContext;
}
else
throw RuntimeException();
}
/*-- 18.12.98 11:55:17---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXTextDocument::hasControllersLocked(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
return aActionArr.Count() > 0;
}
/*-- 18.12.98 13:12:23---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< frame::XController > SwXTextDocument::getCurrentController(void) throw( RuntimeException )
{
return SfxBaseModel::getCurrentController();
}
/*-- 18.12.98 13:12:24---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::setCurrentController(const Reference< frame::XController > & xController)
throw( NoSuchElementException, RuntimeException )
{
SfxBaseModel::setCurrentController(xController);
}
/* -----------------27.01.99 11:48-------------------
*
* --------------------------------------------------*/
Reference< XInterface > SwXTextDocument::getCurrentSelection() throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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;
}
/*-- 18.12.98 13:12:24---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXTextDocument::attachResource(const OUString& aURL, const Sequence< beans::PropertyValue >& aArgs)
throw( RuntimeException )
{
return SfxBaseModel::attachResource(aURL, aArgs);
}
/*-- 18.12.98 13:12:24---------------------------------------------------
-----------------------------------------------------------------------*/
OUString SwXTextDocument::getURL(void) throw( RuntimeException )
{
return SfxBaseModel::getURL();
}
/*-- 18.12.98 13:12:24---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< beans::PropertyValue > SwXTextDocument::getArgs(void) throw( RuntimeException )
{
return SfxBaseModel::getArgs();
}
/*-- 18.12.98 13:12:24---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::connectController(const Reference< frame::XController > & xController) throw( RuntimeException )
{
SfxBaseModel::connectController(xController);
}
/*-- 18.12.98 13:12:25---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::disconnectController(const Reference< frame::XController > & xController) throw( RuntimeException )
{
SfxBaseModel::disconnectController(xController);
}
/*-- 18.12.98 13:12:25---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::dispose(void) throw( RuntimeException )
{
SfxBaseModel::dispose();
}
/*-- 10.05.2005 14:14:39---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::close( sal_Bool bDeliverOwnership ) throw( util::CloseVetoException, RuntimeException )
{
if ( IsValid() && m_pHiddenViewFrame )
{
ASSERT( false, "<SwXTextDocument::close(..)> - rendering data not cleaned up???" );
lcl_DisposeView( m_pHiddenViewFrame, pDocShell);
m_pHiddenViewFrame = 0;
// prevent crash described in #i108805
SfxItemSet *pSet = pDocShell->GetMedium()->GetItemSet();
pSet->Put( SfxBoolItem( SID_HIDDEN, sal_False ) );
}
SfxBaseModel::close(bDeliverOwnership);
}
/*-- 18.12.98 13:12:25---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::addEventListener(const Reference< lang::XEventListener > & aListener) throw( RuntimeException )
{
SfxBaseModel::addEventListener(aListener);
}
/*-- 18.12.98 13:12:26---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::removeEventListener(const Reference< lang::XEventListener > & aListener) throw( RuntimeException )
{
SfxBaseModel::removeEventListener(aListener);
}
/*-- 18.12.98 11:55:19---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XPropertySet > SwXTextDocument::getLineNumberingProperties(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(IsValid())
{
if(!pxXLineNumberingProperties)
{
pxXLineNumberingProperties = new Reference<XPropertySet>;
(*pxXLineNumberingProperties) = new SwXLineNumberingProperties(pDocShell->GetDoc());
}
}
else
throw RuntimeException();
return *pxXLineNumberingProperties;
}
/*-- 18.12.98 11:55:20---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XIndexReplace > SwXTextDocument::getChapterNumberingRules(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXChapterNumbering)
{
pxXChapterNumbering = new Reference< XIndexReplace > ;
*pxXChapterNumbering = new SwXChapterNumbering(*pDocShell);
}
return *pxXChapterNumbering;
}
Reference< XIndexAccess > SwXTextDocument::getNumberingRules(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXNumberingRules )
{
((SwXTextDocument*)this)->pxXNumberingRules = new Reference< XIndexAccess > ;
*pxXNumberingRules = new SwXNumberingRulesCollection( pDocShell->GetDoc() );
}
return *pxXNumberingRules;
}
/*-- 18.12.98 11:55:21---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XIndexAccess > SwXTextDocument::getFootnotes(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXFootnotes)
{
((SwXTextDocument*)this)->pxXFootnotes = new Reference< XIndexAccess > ;
*pxXFootnotes = new SwXFootnotes(sal_False, pDocShell->GetDoc());
}
return *pxXFootnotes;
}
/*-- 18.12.98 11:55:21---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XPropertySet > SAL_CALL
SwXTextDocument::getFootnoteSettings(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXFootnoteSettings)
{
((SwXTextDocument*)this)->pxXFootnoteSettings = new Reference< XPropertySet > ;
*pxXFootnoteSettings = new SwXFootnoteProperties(pDocShell->GetDoc());
}
return *pxXFootnoteSettings;
}
/*-- 18.12.98 11:55:21---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XIndexAccess > SwXTextDocument::getEndnotes(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXEndnotes)
{
((SwXTextDocument*)this)->pxXEndnotes = new Reference< XIndexAccess > ;
*pxXEndnotes = new SwXFootnotes(sal_True, pDocShell->GetDoc());
}
return *pxXEndnotes;
}
/*-- 18.12.98 11:55:22---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XPropertySet > SwXTextDocument::getEndnoteSettings(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXEndnoteSettings)
{
((SwXTextDocument*)this)->pxXEndnoteSettings = new Reference< XPropertySet > ;
*pxXEndnoteSettings = new SwXEndnoteProperties(pDocShell->GetDoc());
}
return *pxXEndnoteSettings;
}
/*-- 18.12.98 11:55:22---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< util::XReplaceDescriptor > SwXTextDocument::createReplaceDescriptor(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Reference< util::XReplaceDescriptor > xRet = new SwXTextSearch;
return xRet;
}
/* -----------------26.02.99 15:52-------------------
*
* --------------------------------------------------*/
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(sal_False);
return pUnoCrsr;
}
/*-- 18.12.98 11:55:22---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Int32 SwXTextDocument::replaceAll(const Reference< util::XSearchDescriptor > & xDesc)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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;
// Suche soll ueberall stattfinden
pUnoCrsr->SetRemainInSection(sal_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);
sal_Bool bCancel;
nResult = (sal_Int32)pUnoCrsr->Find( aSearch, !pSearch->bStyles,
eStart, eEnd, bCancel,
(FindRanges)eRanges,
pSearch->sSearchText.Len() ? &aSearchOpt : 0,
&aReplace );
}
else if(pSearch->bStyles)
{
SwTxtFmtColl *pSearchColl = lcl_GetParaStyle(pSearch->sSearchText, pUnoCrsr->GetDoc());
SwTxtFmtColl *pReplaceColl = lcl_GetParaStyle(pSearch->sReplaceText, pUnoCrsr->GetDoc());;
sal_Bool bCancel;
nResult = pUnoCrsr->Find( *pSearchColl,
eStart, eEnd, bCancel,
(FindRanges)eRanges, pReplaceColl );
}
else
{
//todo/mba: assuming that notes should be omitted
sal_Bool bSearchInNotes = sal_False;
sal_Bool bCancel;
nResult = pUnoCrsr->Find( aSearchOpt, bSearchInNotes,
eStart, eEnd, bCancel,
(FindRanges)eRanges,
sal_True );
}
return (sal_Int32)nResult;
}
/*-- 18.12.98 11:55:22---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< util::XSearchDescriptor > SwXTextDocument::createSearchDescriptor(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Reference< util::XSearchDescriptor > xRet = new SwXTextSearch;
return xRet;
}
/* -----------------26.02.99 16:08-------------------
* wird fuer findAll/First/Next verwendet
* --------------------------------------------------*/
SwUnoCrsr* SwXTextDocument::FindAny(const Reference< util::XSearchDescriptor > & xDesc,
Reference< XTextCursor > & xCrsr, sal_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()));
sal_Bool bParentInExtra = sal_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 );
/*
* folgende Kombinationen sind erlaubt:
* - suche einen im Body: -> FND_IN_BODY
* - suche alle im Body: -> FND_IN_BODYONLY | FND_IN_SELALL
* - suche in Selectionen: einen / alle -> FND_IN_SEL [ | FND_IN_SELALL ]
* - suche im nicht Body: einen / alle -> FND_IN_OTHER [ | FND_IN_SELALL ]
* - suche ueberall alle: -> FND_IN_SELALL
*/
int eRanges(FND_IN_BODY);
if(bParentInExtra)
eRanges = FND_IN_OTHER;
if(bAll) //immer - ueberall?
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);
sal_Bool bCancel;
nResult = (sal_Int32)pUnoCrsr->Find( aSearch, !pSearch->bStyles,
eStart, eEnd, bCancel,
(FindRanges)eRanges,
pSearch->sSearchText.Len() ? &aSearchOpt : 0,
0 );
}
else if(pSearch->bStyles)
{
SwTxtFmtColl *pSearchColl = lcl_GetParaStyle(pSearch->sSearchText, pUnoCrsr->GetDoc());
//pSearch->sReplaceText
SwTxtFmtColl *pReplaceColl = 0;
sal_Bool bCancel;
nResult = (sal_Int32)pUnoCrsr->Find( *pSearchColl,
eStart, eEnd, bCancel,
(FindRanges)eRanges, pReplaceColl );
}
else
{
//todo/mba: assuming that notes should be omitted
sal_Bool bSearchInNotes = sal_False;
sal_Bool bCancel;
nResult = (sal_Int32)pUnoCrsr->Find( aSearchOpt, bSearchInNotes,
eStart, eEnd, bCancel,
(FindRanges)eRanges,
/*int bReplace =*/sal_False );
}
nSearchProc++;
if(nResult || (eRanges&(FND_IN_SELALL|FND_IN_OTHER)))
break;
//second step - find in other
eRanges = FND_IN_OTHER;
}
return pUnoCrsr;
}
/*-- 18.12.98 11:55:23---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XIndexAccess >
SwXTextDocument::findAll(const Reference< util::XSearchDescriptor > & xDesc)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Reference< XInterface > xTmp;
sal_Int32 nResult = 0;
Reference< XTextCursor > xCrsr;
SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, sal_True, nResult, xTmp);
if(!pResultCrsr)
throw RuntimeException();
Reference< XIndexAccess > xRet;
xRet = new SwXTextRanges( (nResult) ? pResultCrsr : 0 );
delete pResultCrsr;
return xRet;
}
/*-- 18.12.98 11:55:23---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XInterface > SwXTextDocument::findFirst(const Reference< util::XSearchDescriptor > & xDesc)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Reference< XInterface > xTmp;
sal_Int32 nResult = 0;
Reference< XTextCursor > xCrsr;
SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, sal_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;
}
/*-- 18.12.98 11:55:24---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XInterface > SwXTextDocument::findNext(const Reference< XInterface > & xStartAt,
const Reference< util::XSearchDescriptor > & xDesc)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
Reference< XInterface > xTmp;
sal_Int32 nResult = 0;
Reference< XTextCursor > xCrsr;
if(!xStartAt.is())
throw RuntimeException();
SwUnoCrsr* pResultCrsr = FindAny(xDesc, xCrsr, sal_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;
}
/*-- 18.12.98 11:55:24---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< beans::PropertyValue > SwXTextDocument::getPagePrintSettings(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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(C2U("PageRows"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int16)aData.GetCol();
pArray[1] = beans::PropertyValue(C2U("PageColumns"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(aData.GetLeftSpace());
pArray[2] = beans::PropertyValue(C2U("LeftMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(aData.GetRightSpace());
pArray[3] = beans::PropertyValue(C2U("RightMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(aData.GetTopSpace());
pArray[4] = beans::PropertyValue(C2U("TopMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(aData.GetBottomSpace());
pArray[5] = beans::PropertyValue(C2U("BottomMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(aData.GetHorzSpace());
pArray[6] = beans::PropertyValue(C2U("HoriMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
aVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(aData.GetVertSpace());
pArray[7] = beans::PropertyValue(C2U("VertMargin"), -1, aVal, PropertyState_DIRECT_VALUE);
sal_Bool bTemp = aData.GetLandscape();
aVal.setValue(&bTemp, ::getCppuBooleanType());
pArray[8] = beans::PropertyValue(C2U("IsLandscape"), -1, aVal, PropertyState_DIRECT_VALUE);
}
else
throw RuntimeException();
return aSeq;
}
/* -----------------24.02.99 10:57-------------------
*
* --------------------------------------------------*/
sal_uInt32 lcl_Any_To_ULONG(const Any& rValue, sal_Bool& bException)
{
bException = sal_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;
}
/*-- 09.06.2004 12:18:10---------------------------------------------------
-----------------------------------------------------------------------*/
String lcl_CreateOutlineString( sal_uInt16 nIndex,
const SwOutlineNodes& rOutlineNodes, const SwNumRule* pOutlRule)
{
String 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 += String::CreateFromInt32( nVal );
sEntry += '.';
}
sEntry += rOutlineNodes[ nIndex ]->
GetTxtNode()->GetExpandTxt( 0, STRING_LEN, sal_False );
return sEntry;
}
/*-- 18.12.98 11:55:25---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::setPagePrintSettings(const Sequence< beans::PropertyValue >& aSettings)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(IsValid())
{
SwPagePreViewPrtData aData;
//falls nur einige Properties kommen, dann die akt. Einstellungen benutzen
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++)
{
String sName = pProperties[i].Name;
const Any& rVal = pProperties[i].Value;
sal_Bool bException;
sal_uInt32 nVal = lcl_Any_To_ULONG(rVal, bException);
if( COMPARE_EQUAL == sName.CompareToAscii("PageRows" ) )
{
if(!nVal || nVal > 0xff)
throw RuntimeException();
aData.SetRow((sal_uInt8)nVal);
}
else if(COMPARE_EQUAL == sName.CompareToAscii("PageColumns"))
{
if(!nVal || nVal > 0xff)
throw RuntimeException();
aData.SetCol((sal_uInt8)nVal);
}
else if(COMPARE_EQUAL == sName.CompareToAscii("LeftMargin"))
{
aData.SetLeftSpace(MM100_TO_TWIP_UNSIGNED(nVal));
}
else if(COMPARE_EQUAL == sName.CompareToAscii("RightMargin"))
{
aData.SetRightSpace(MM100_TO_TWIP_UNSIGNED(nVal));
}
else if(COMPARE_EQUAL == sName.CompareToAscii("TopMargin"))
{
aData.SetTopSpace(MM100_TO_TWIP_UNSIGNED(nVal));
}
else if(COMPARE_EQUAL == sName.CompareToAscii("BottomMargin"))
{
aData.SetBottomSpace(MM100_TO_TWIP_UNSIGNED(nVal));
}
else if(COMPARE_EQUAL == sName.CompareToAscii("HoriMargin"))
{
aData.SetHorzSpace(MM100_TO_TWIP_UNSIGNED(nVal));
}
else if(COMPARE_EQUAL == sName.CompareToAscii("VertMargin"))
{
aData.SetVertSpace(MM100_TO_TWIP_UNSIGNED(nVal));
}
else if(COMPARE_EQUAL == sName.CompareToAscii("IsLandscape"))
{
bException = (::getBooleanCppuType() != rVal.getValueType());
aData.SetLandscape(*(sal_Bool*)rVal.getValue());
}
else
bException = sal_True;
if(bException)
throw RuntimeException();
}
pDocShell->GetDoc()->SetPreViewPrtData(&aData);
}
else
throw RuntimeException();
}
/*-- 18.12.98 11:55:25---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::printPages(const Sequence< beans::PropertyValue >& xOptions)
throw( IllegalArgumentException, RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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, sal_True));
OUString sFileName( C2U(SW_PROP_NAME_STR(UNO_NAME_FILE_NAME)));
OUString sCopyCount(C2U(SW_PROP_NAME_STR(UNO_NAME_COPY_COUNT)));
OUString sCollate(C2U(SW_PROP_NAME_STR(UNO_NAME_COLLATE)));
OUString sSort(C2U(SW_PROP_NAME_STR(UNO_NAME_SORT)));
OUString sPages(C2U(SW_PROP_NAME_STR(UNO_NAME_PAGES)));
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 == sFileName )
{
OUString sFileURL;
if ( (rProp.Value >>= sFileURL ) )
{
// Convert the File URL into a system dependant 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 == sCopyCount )
{
sal_Int32 nCopies = 0;
aValue >>= nCopies;
aReq.AppendItem(SfxInt16Item( SID_PRINT_COPIES, (sal_Int16)nCopies ) );
}
// Collate-Property
else if ( rProp.Name == sCollate )
{
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 == sSort )
{
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 == sPages )
{
OUString sTmp;
if ( rProp.Value >>= sTmp )
aReq.AppendItem( SfxStringItem( SID_PRINT_PAGES, sTmp ) );
else
throw IllegalArgumentException();
}
}
// --> OD #i117783#
bApplyPagePrintSettingsFromXPagePrintable = sal_True;
// <--
pFrame->GetViewShell()->ExecuteSlot(aReq);
// Frame schliessen
pFrame->DoClose();
}
else
throw RuntimeException();
}
/*-- 18.12.98 11:55:25---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getReferenceMarks(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXReferenceMarks)
{
((SwXTextDocument*)this)->pxXReferenceMarks = new Reference< XNameAccess > ;
*pxXReferenceMarks = new SwXReferenceMarks(pDocShell->GetDoc());
}
return *pxXReferenceMarks;
}
/* -----------------21.12.98 10:20-------------------
*
* --------------------------------------------------*/
Reference< XEnumerationAccess > SwXTextDocument::getTextFields(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXTextFieldTypes)
{
((SwXTextDocument*)this)->pxXTextFieldTypes = new Reference< XEnumerationAccess > ;
*pxXTextFieldTypes = new SwXTextFieldTypes(pDocShell->GetDoc());
}
return *pxXTextFieldTypes;
}
/*-- 21.12.98 10:21:12---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getTextFieldMasters(void)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXTextFieldMasters)
{
((SwXTextDocument*)this)->pxXTextFieldMasters = new Reference< XNameAccess > ;
*pxXTextFieldMasters = new SwXTextFieldMasters(pDocShell->GetDoc());
}
return *pxXTextFieldMasters;
}
/*-- 21.12.98 10:21:12---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getEmbeddedObjects(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXEmbeddedObjects)
{
((SwXTextDocument*)this)->pxXEmbeddedObjects = new Reference< XNameAccess > ;
*pxXEmbeddedObjects = new SwXTextEmbeddedObjects(pDocShell->GetDoc());
}
return *pxXEmbeddedObjects;
}
/*-- 21.12.98 10:21:13---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getBookmarks(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXBookmarks)
{
((SwXTextDocument*)this)->pxXBookmarks = new Reference< XNameAccess > ;
*pxXBookmarks = new SwXBookmarks(pDocShell->GetDoc());
}
return *pxXBookmarks;
}
/*-- 21.12.98 10:21:13---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getTextSections(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXTextSections)
{
((SwXTextDocument*)this)->pxXTextSections = new Reference< XNameAccess > ;
*pxXTextSections = new SwXTextSections(pDocShell->GetDoc());
}
return *pxXTextSections;
}
/*-- 21.12.98 10:21:13---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getTextTables(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXTextTables)
{
((SwXTextDocument*)this)->pxXTextTables = new Reference< XNameAccess > ;
*pxXTextTables = new SwXTextTables(pDocShell->GetDoc());
}
return *pxXTextTables;
}
/*-- 21.12.98 10:21:13---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getGraphicObjects(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXGraphicObjects)
{
((SwXTextDocument*)this)->pxXGraphicObjects = new Reference< XNameAccess > ;
*pxXGraphicObjects = new SwXTextGraphicObjects(pDocShell->GetDoc());
}
return *pxXGraphicObjects;
}
/*-- 21.12.98 10:21:14---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getTextFrames(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXTextFrames)
{
((SwXTextDocument*)this)->pxXTextFrames = new Reference< XNameAccess > ;
*pxXTextFrames = new SwXTextFrames(pDocShell->GetDoc());
}
return *pxXTextFrames;
}
/* -----------------21.12.98 10:56-------------------
*
* --------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getStyleFamilies(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXStyleFamilies)
{
((SwXTextDocument*)this)->pxXStyleFamilies = new Reference< XNameAccess > ;
*pxXStyleFamilies = new SwXStyleFamilies(*pDocShell);
}
return *pxXStyleFamilies;
}
/*-- 19.05.06 10:15:22---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< style::XAutoStyles > SwXTextDocument::getAutoStyles( )
throw (uno::RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXAutoStyles)
{
pxXAutoStyles = new Reference< style::XAutoStyles > ;
*pxXAutoStyles = new SwXAutoStyles(*pDocShell);
}
return *pxXAutoStyles;
}
/*-- 22.01.99 10:18:03---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< drawing::XDrawPage > SwXTextDocument::getDrawPage(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXDrawPage)
{
// simplified this creation, keeping original below as reference
// for the case that it did something by purpose
((SwXTextDocument*)this)->pDrawPage = new SwXDrawPage(pDocShell->GetDoc());
((SwXTextDocument*)this)->pxXDrawPage = new Reference< drawing::XDrawPage >(pDrawPage);
//((SwXTextDocument*)this)->pxXDrawPage = new Reference< drawing::XDrawPage > ;
//((SwXTextDocument*)this)->pDrawPage = new SwXDrawPage(pDocShell->GetDoc());
//Reference< drawing::XShapes > xTmp = pDrawPage;
//*pxXDrawPage = Reference< drawing::XDrawPage>(xTmp, UNO_QUERY);
}
return *pxXDrawPage;
}
/* -----------------07.04.99 10:11-------------------
*
* --------------------------------------------------*/
SwXDrawPage* SwXTextDocument::GetDrawPage()
{
if(!IsValid())
return 0;
if(!pDrawPage)
getDrawPage();
return pDrawPage;
}
/*-- 18.12.98 11:55:26---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::Invalidate()
{
bObjectValid = sal_False;
if(xNumFmtAgg.is())
{
const uno::Type& rTunnelType = ::getCppuType((Reference <XUnoTunnel>*)0);
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);
}
DBG_ASSERT(pNumFmt, "No number formatter available");
}
InitNewDoc();
pDocShell = 0;
aRefreshCont.Disposing();
}
/* -----------------------------13.07.00 15:59--------------------------------
---------------------------------------------------------------------------*/
void SwXTextDocument::Reactivate(SwDocShell* pNewDocShell)
{
if(pDocShell && pDocShell != pNewDocShell)
Invalidate();
pDocShell = pNewDocShell;
bObjectValid = sal_True;
}
/*-- 18.12.98 11:55:26---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::InitNewDoc()
{
// zunaechst alle Collections invalidieren, dann Referenzen loeschen und Null setzen
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 = ::getCppuType((Reference <XUnoTunnel>*)0);
Any aNumTunnel = xNumFmtAgg->queryAggregation(rTunnelType);
SvNumberFormatsSupplierObj* pNumFmt = 0;
Reference< XUnoTunnel > xNumTunnel;
if(aNumTunnel >>= xNumTunnel)
{
pNumFmt = reinterpret_cast<SvNumberFormatsSupplierObj*>(
xNumTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId()));
}
DBG_ASSERT(pNumFmt, "No number formatter available");
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)
{
// --> OD 2008-07-23 #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;
}
}
/*-- 11.03.99 11:51:40---------------------------------------------------
-----------------------------------------------------------------------*/
#define COM_SUN_STAR__DRAWING_LENGTH 13
Reference< XInterface > SwXTextDocument::createInstance(const OUString& rServiceName)
throw( Exception, RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
Reference< XInterface > xRet;
sal_uInt16 nType = SwXServiceProvider::GetProviderType(rServiceName);
if(nType != SW_SERVICE_INVALID)
{
xRet = SwXServiceProvider::MakeInstance(nType, pDocShell->GetDoc());
}
else
{
if( rServiceName.compareToAscii( "com.sun.star.", 13 ) == 0 )
{
sal_Int32 nIndex = COM_SUN_STAR__DRAWING_LENGTH;
OUString sCategory = rServiceName.getToken( 0, '.', nIndex );
sal_Bool bShape = sCategory == C2U("drawing");
if( bShape || sCategory == C2U("form"))
{
if(bShape)
{
short nTable = 0;
if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.DashTable") ) )
nTable = SW_CREATE_DASH_TABLE;
else if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.GradientTable") ) )
nTable = SW_CREATE_GRADIENT_TABLE;
else if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.HatchTable") ) )
nTable = SW_CREATE_HATCH_TABLE;
else if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.BitmapTable") ) )
nTable = SW_CREATE_BITMAP_TABLE;
else if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.TransparencyGradientTable") ) )
nTable = SW_CREATE_TRANSGRADIENT_TABLE;
else if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.MarkerTable") ) )
nTable = SW_CREATE_MARKER_TABLE;
else if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.Defaults") ) )
nTable = SW_CREATE_DRAW_DEFAULTS;
if(nTable)
{
xRet = GetPropertyHelper()->GetDrawTable(nTable);
}
}
}
else if (sCategory == C2U ("document") )
{
if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.Settings") ) )
xRet = Reference < XInterface > ( *new SwXDocumentSettings ( this ) );
if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.document.ImportEmbeddedObjectResolver") ) )
{
xRet = (::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pDocShell, EMBEDDEDOBJECTHELPER_MODE_READ );
}
}
else if (sCategory == C2U ("text") )
{
if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.DocumentSettings") ) )
xRet = Reference < XInterface > ( *new SwXDocumentSettings ( this ) );
}
else if (sCategory == C2U ("chart2") )
{
if( 0 == rServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.chart2.data.DataProvider") ) )
xRet = Reference < XInterface > ( dynamic_cast< chart2::data::XDataProvider * >(pDocShell->getIDocumentChartDataProviderAccess()->GetChartDataProvider()) );
}
if(!xRet.is())
{
//! we don't 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"!
if (rServiceName.lastIndexOf( C2U(".OLE2Shape") ) == rServiceName.getLength() - 10)
throw ServiceNotRegisteredException(); // declare service to be not registered with this factory
// --> OD 2006-02-22 #b6382898#
// 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 ( bShape &&
rServiceName.compareToAscii( "com.sun.star.drawing.temporaryForXMLImportOLE2Shape" ) == 0 )
{
aTmpServiceName = OUString::createFromAscii( "com.sun.star.drawing.OLE2Shape" );
}
//hier den Draw - Service suchen
Reference< XInterface > xTmp = SvxFmMSFactory::createInstance(aTmpServiceName);
// <--
if(bShape)
{
nIndex = COM_SUN_STAR__DRAWING_LENGTH;
if( 0 == rServiceName.reverseCompareToAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.drawing.GroupShape" ) ) ||
0 == rServiceName.reverseCompareToAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.drawing.Shape3DSceneObject" ) ) )
xRet = *new SwXGroupShape( xTmp );
else
xRet = *new SwXShape( xTmp );
}
else
xRet = xTmp;
}
}
else
throw ServiceNotRegisteredException();
}
return xRet;
}
/*-- 11.03.99 11:51:40---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XInterface > SwXTextDocument::createInstanceWithArguments(
const OUString& ServiceSpecifier,
const Sequence< Any >& /*Arguments*/)
throw( Exception, RuntimeException )
{
Reference< XInterface > xInt = createInstance(ServiceSpecifier);
//die Any-Sequence dient zur Initialisierung von Objekten, die auf
//Parameter zwingend angewiesen sind - bis jetzt haben wir das nicht
return xInt;
}
/*-- 11.03.99 11:51:41---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< OUString > SwXTextDocument::getAvailableServiceNames(void)
throw( RuntimeException )
{
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].compareToAscii( "com.sun.star.drawing.OLE2Shape" ) == 0 )
{
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;
}
/* -----------------18.03.99 11:36-------------------
*
* --------------------------------------------------*/
OUString SwXTextDocument::getImplementationName(void) throw( RuntimeException )
{
return C2U("SwXTextDocument");
}
/* -----------------20.01.04 10:14-------------------
*
* --------------------------------------------------*/
sal_Bool SwXTextDocument::supportsService(const OUString& rServiceName) throw( RuntimeException )
{
if (
(rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.document.OfficeDocument" ))) ||
(rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.text.GenericTextDocument")))
)
return sal_True;
sal_Bool bWebDoc = (0 != PTR_CAST(SwWebDocShell, pDocShell));
sal_Bool bGlobalDoc = (0 != PTR_CAST(SwGlobalDocShell, pDocShell));
sal_Bool bTextDoc = (!bWebDoc && !bGlobalDoc);
return (
(bWebDoc && rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.WebDocument" ))) ||
(bGlobalDoc && rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.GlobalDocument"))) ||
(bTextDoc && rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextDocument" )))
);
}
/* -----------------20.01.04 10:17-------------------
*
* --------------------------------------------------*/
Sequence< OUString > SwXTextDocument::getSupportedServiceNames(void) throw( RuntimeException )
{
sal_Bool bWebDoc = (0 != PTR_CAST(SwWebDocShell, pDocShell));
sal_Bool bGlobalDoc = (0 != PTR_CAST(SwGlobalDocShell, pDocShell));
sal_Bool bTextDoc = (!bWebDoc && !bGlobalDoc);
Sequence< OUString > aRet (3);
OUString* pArray = aRet.getArray();
pArray[0] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( ( "com.sun.star.document.OfficeDocument" ) ) );
pArray[1] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( ( "com.sun.star.text.GenericTextDocument" ) ) );
if (bTextDoc)
pArray[2] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( ( "com.sun.star.text.TextDocument" ) ) );
else
if (bWebDoc)
pArray[2] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( ( "com.sun.star.text.WebDocument" ) ) );
else
if (bGlobalDoc)
pArray[2] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( ( "com.sun.star.text.GlobalDocument" ) ) );
return aRet;
}
/* -----------------05.05.99 12:10-------------------
*
* --------------------------------------------------*/
Reference< XIndexAccess > SwXTextDocument::getDocumentIndexes(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
if(!pxXDocumentIndexes)
{
((SwXTextDocument*)this)->pxXDocumentIndexes = new Reference< XIndexAccess > ;
*pxXDocumentIndexes = new SwXDocumentIndexes(pDocShell->GetDoc());
}
return *pxXDocumentIndexes;
}
/*-- 10.05.99 13:58:58---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XPropertySetInfo > SwXTextDocument::getPropertySetInfo(void) throw( RuntimeException )
{
static Reference< XPropertySetInfo > xRet = pPropSet->getPropertySetInfo();
return xRet;
}
/*-- 10.05.99 13:58:58---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::setPropertyValue(const OUString& rPropertyName,
const Any& aValue)
throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException,
WrappedTargetException, RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
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();
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:
{
sal_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;
sal_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
// --> OD 2005-08-08 #i52858# - method name changed
pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetOrCreateDrawModel() );
// <--
pDrawDoc->SetAutoControlFocus ( bAuto );
}
}
break;
case WID_DOC_APPLY_FORM_DESIGN_MODE:
{
SwDrawDocument * pDrawDoc;
sal_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
// --> OD 2005-08-08 #i52858# - method name changed
pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetOrCreateDrawModel() );
// <--
pDrawDoc->SetOpenInDesignMode ( bMode );
}
}
break;
// --> FME 2005-02-25 #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;
// --> OD 2006-03-21 #b6375613#
case WID_APPLY_WORKAROUND_FOR_B6375613:
{
bool bApplyWorkaroundForB6375613( false );
aValue >>= bApplyWorkaroundForB6375613;
pDocShell->GetDoc()->SetApplyWorkaroundForB6375613( bApplyWorkaroundForB6375613 );
}
break;
// <--
case WID_DOC_DEFAULT_PAGE_MODE:
{
bool bDefaultPageMode( false );
aValue >>= bDefaultPageMode;
pDocShell->GetDoc()->SetDefaultPageMode( bDefaultPageMode );
}
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;
}
}
}
/*-- 10.05.99 13:58:59---------------------------------------------------
-----------------------------------------------------------------------*/
Any SwXTextDocument::getPropertyValue(const OUString& rPropertyName)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap()->getByName( rPropertyName);
if(!pEntry)
throw UnknownPropertyException();
Any aAny;
switch(pEntry->nWID)
{
case WID_DOC_CHAR_COUNT :
case WID_DOC_PARA_COUNT :
case WID_DOC_WORD_COUNT :
{
SwDocStat aStat(pDocShell->GetDoc()->GetDocStat());
if(aStat.bModified)
pDocShell->GetDoc()->UpdateDocStat( aStat );
sal_Int32 nValue;
switch(pEntry->nWID)
{
case WID_DOC_CHAR_COUNT :nValue = aStat.nChar;break;
case WID_DOC_PARA_COUNT :nValue = aStat.nPara;break;
case WID_DOC_WORD_COUNT :nValue = aStat.nWord;break;
}
aAny <<= nValue;
}
break;
case WID_DOC_WORD_SEPARATOR :
{
aAny <<= OUString(SW_MOD()->GetDocStatWordDelim());
}
break;
case WID_DOC_CHANGES_RECORD:
case WID_DOC_CHANGES_SHOW:
{
sal_uInt16 eMode = pDocShell->GetDoc()->GetRedlineMode();
sal_Bool bSet = sal_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 <<= OUString(pDocShell->GetDoc()->GetTOIAutoMarkURL());
break;
case WID_DOC_HIDE_TIPS :
{
sal_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 ( sal_True )->GetYear2000());
}
break;
case WID_DOC_AUTOMATIC_CONTROL_FOCUS:
{
SwDrawDocument * pDrawDoc;
sal_Bool bAuto;
if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetDrawModel() ) ) )
bAuto = pDrawDoc->GetAutoControlFocus();
else
bAuto = sal_False;
aAny.setValue(&bAuto, ::getBooleanCppuType());
}
break;
case WID_DOC_APPLY_FORM_DESIGN_MODE:
{
SwDrawDocument * pDrawDoc;
sal_Bool bMode;
if ( 0 != ( pDrawDoc = dynamic_cast< SwDrawDocument * > (pDocShell->GetDoc()->GetDrawModel() ) ) )
bMode = pDrawDoc->GetOpenInDesignMode();
else
bMode = sal_True;
aAny.setValue(&bMode, ::getBooleanCppuType());
}
break;
case WID_DOC_BASIC_LIBRARIES:
aAny <<= pDocShell->GetBasicContainer();
break;
case WID_DOC_DIALOG_LIBRARIES:
aAny <<= pDocShell->GetDialogContainer();
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;
// --> OD 2006-03-21 #b6375613#
case WID_APPLY_WORKAROUND_FOR_B6375613:
{
aAny <<= pDocShell->GetDoc()->ApplyWorkaroundForB6375613();
}
break;
// <--
default:
{
const SfxPoolItem& rItem = pDocShell->GetDoc()->GetDefault(pEntry->nWID);
rItem.QueryValue(aAny, pEntry->nMemberId);
}
}
return aAny;
}
/*-- 10.05.99 13:58:59---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::addPropertyChangeListener(const OUString& /*PropertyName*/,
const Reference< XPropertyChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 10.05.99 13:58:59---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::removePropertyChangeListener(const OUString& /*PropertyName*/,
const Reference< XPropertyChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 10.05.99 13:59:00---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::addVetoableChangeListener(const OUString& /*PropertyName*/,
const Reference< XVetoableChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
DBG_WARNING("not implemented");
}
/*-- 10.05.99 13:59:00---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::removeVetoableChangeListener(const OUString& /*PropertyName*/,
const Reference< XVetoableChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
DBG_WARNING("not implemented");
}
/* -----------------25.10.99 10:42-------------------
--------------------------------------------------*/
Reference< XNameAccess > SwXTextDocument::getLinks(void) throw( RuntimeException )
{
if(!pxLinkTargetSupplier)
{
pxLinkTargetSupplier = new Reference< XNameAccess > ;
(*pxLinkTargetSupplier) = new SwXLinkTargetSupplier(*(SwXTextDocument*)this);
}
return (*pxLinkTargetSupplier);
}
/* -----------------------------11.01.01 15:01--------------------------------
---------------------------------------------------------------------------*/
Reference< XEnumerationAccess > SwXTextDocument::getRedlines( ) throw(RuntimeException)
{
if(!pxXRedlines)
{
pxXRedlines = new Reference< XEnumerationAccess > ;
(*pxXRedlines) = new SwXRedlines(pDocShell->GetDoc());
}
return *pxXRedlines;
}
/*-- 21.02.00 08:41:06---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::refresh(void) throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
ViewShell *pViewShell = pDocShell->GetWrtShell();
notifyRefreshListeners();
if(pViewShell)
pViewShell->CalcLayout();
}
/*-- 21.02.00 08:41:06---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::addRefreshListener(const Reference< util::XRefreshListener > & l)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if ( !IsValid() )
throw RuntimeException();
aRefreshCont.AddListener ( reinterpret_cast < const Reference < lang::XEventListener > &> ( l ));
}
/*-- 21.02.00 08:41:07---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXTextDocument::removeRefreshListener(const Reference< util::XRefreshListener > & l)
throw( RuntimeException )
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if ( !IsValid() || !aRefreshCont.RemoveListener ( reinterpret_cast < const Reference < lang::XEventListener > &> ( l ) ) )
throw RuntimeException();
}
/* -----------------------------26.02.01 12:22--------------------------------
---------------------------------------------------------------------------*/
void SwXTextDocument::updateLinks( ) throw(RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
SwDoc* pDoc = pDocShell->GetDoc();
sfx2::LinkManager& rLnkMan = pDoc->GetLinkManager();
if( rLnkMan.GetLinks().Count() )
{
UnoActionContext aAction(pDoc);
rLnkMan.UpdateAllLinks( sal_False, sal_False, sal_True );
}
}
//XPropertyState
PropertyState SAL_CALL SwXTextDocument::getPropertyState( const OUString& rPropertyName )
throw (UnknownPropertyException, RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
PropertyState eRet = PropertyState_DIRECT_VALUE;
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 eRet;
}
Sequence< PropertyState > SAL_CALL SwXTextDocument::getPropertyStates( const Sequence< OUString >& rPropertyNames )
throw (UnknownPropertyException, RuntimeException)
{
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)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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( C2U( "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.equalsAscii( "View" ))
{
aTmp = pProps[i].Value;
break;
}
}
uno::Reference< frame::XController > xController;
if (aTmp >>= xController)
{
DBG_ASSERT( 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
{
DBG_ASSERT( !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!
DBG_ASSERT( bIsPDFExport, "view is missing, guessing one..." );
rpView = GuessViewShell( bIsSwSrcView );
}
DBG_ASSERT( rpView, "ViewShell 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))
{
SfxObjectShellLock xDocSh(((SwView*)rpView)->GetOrCreateTmpSelectionDoc());
if (xDocSh.Is())
{
pDoc = ((SwDocShell*)&xDocSh)->GetDoc();
rpView = pDoc->GetDocShell()->GetView();
}
}
else
{
DBG_ERROR( "unexpected ViewShell" );
}
}
}
return pDoc;
}
/* -----------------------------23.08.02 16:00--------------------------------
---------------------------------------------------------------------------*/
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)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
CleanUpRenderingData();
const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" );
bool bIsSwSrcView = false;
SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport );
SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport );
DBG_ASSERT( pDoc && pView, "doc or view shell missing!" );
if ( pDoc == 0 || pView == 0 )
{
return 0;
}
if ( !bIsSwSrcView )
{
m_pRenderData = new SwRenderData;
}
// new <PrintUIOptions>
m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView );
const bool bFormat = m_pPrintUIOptions->processPropertiesAndCheckFormat( rxOptions );
// 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 ViewShell!
ViewShell* 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 );
pSwView->RecheckBrowseMode();
}
// reformating 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->SetSwPrtOptions( new SwPrintData );
m_pRenderData->MakeSwPrtOptions( m_pRenderData->GetSwPrtOptionsRef(), pRenderDocShell,
m_pPrintUIOptions, m_pRenderData, 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( sal_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( sal_False );
bStateChanged = true;
}
// --> FME 2005-05-23 #122919# Force field update before PDF export:
pViewShell->ViewShell::UpdateFlds(sal_True);
// <--
if( bStateChanged )
pRenderDocShell->EnableSetModified( sal_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( sal_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
{
if ( m_pRenderData->HasPostItData() )
{
m_pRenderData->DeletePostItData();
}
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();
}
}
DBG_ASSERT( nRet >= 0, "negative number of pages???" );
return nRet;
}
/* -----------------------------23.08.02 16:00--------------------------------
---------------------------------------------------------------------------*/
uno::Sequence< beans::PropertyValue > SAL_CALL SwXTextDocument::getRenderer(
sal_Int32 nRenderer,
const uno::Any& rSelection,
const uno::Sequence< beans::PropertyValue >& rxOptions )
throw (IllegalArgumentException, RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
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 );
DBG_ASSERT( pDoc && pView, "doc or view shell missing!" );
if (!pDoc || !pView)
return uno::Sequence< beans::PropertyValue >();
if ( nRenderer < 0 || nRenderer >= SAL_MAX_UINT16 )
throw IllegalArgumentException();
// TODO/mba: we really need a generic way to get the ViewShell!
ViewShell* 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)
{
DBG_ASSERT( 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)
{
const sal_Int32 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( 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;
}
}
}
}
else
{
ASSERT( nPage > 0 && nPage <= SAL_MAX_UINT16,
"<SwXTextDocument::getRenderer(..)> - unexpected value for the page number, it does not fit into sal_uInt16." );
aTmpSize = pVwSh->GetPageSize( static_cast< sal_uInt16 >(nPage), bIsSkipEmptyPages );
aPageSize = awt::Size ( TWIP_TO_MM100( aTmpSize.Width() ),
TWIP_TO_MM100( aTmpSize.Height() ));
}
sal_Int32 nLen = 2;
aRenderer.realloc(2);
aRenderer[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) );
aRenderer[0].Value <<= aPageSize;
aRenderer[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageIncludesNonprintableArea" ) );
aRenderer[1].Value <<= sal_True;
if (aPreferredPageSize.Width && aPreferredPageSize.Height)
{
++nLen;
aRenderer.realloc( nLen );
aRenderer[ nLen - 1 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PreferredPageSize" ) );
aRenderer[ nLen - 1 ].Value <<= aPreferredPageSize;
}
if (nPrinterPaperTray >= 0)
{
++nLen;
aRenderer.realloc( nLen );
aRenderer[ nLen - 1 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PrinterPaperTray" ) );
aRenderer[ nLen - 1 ].Value <<= nPrinterPaperTray;
}
}
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 = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpRows" ) );
aRenderer[ nRenderDataIdxStart + 0 ].Value <<= ( nRow > 1 ? nRow : 1 );
const sal_Int32 nCol = pPagePrintSettings->GetCol();
aRenderer[ nRenderDataIdxStart + 1 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpColumns" ) );
aRenderer[ nRenderDataIdxStart + 1 ].Value <<= ( nCol > 1 ? nCol : 1 );
aRenderer[ nRenderDataIdxStart + 2 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpPageMarginLeft" ) );
aRenderer[ nRenderDataIdxStart + 2 ].Value <<= pPagePrintSettings->GetLeftSpace();
aRenderer[ nRenderDataIdxStart + 3 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpPageMarginRight" ) );
aRenderer[ nRenderDataIdxStart + 3 ].Value <<= pPagePrintSettings->GetRightSpace();
aRenderer[ nRenderDataIdxStart + 4 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpPageMarginTop" ) );
aRenderer[ nRenderDataIdxStart + 4 ].Value <<= pPagePrintSettings->GetTopSpace();
aRenderer[ nRenderDataIdxStart + 5 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpPageMarginBottom" ) );
aRenderer[ nRenderDataIdxStart + 5 ].Value <<= pPagePrintSettings->GetBottomSpace();
aRenderer[ nRenderDataIdxStart + 6 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpHorizontalSpacing" ) );
aRenderer[ nRenderDataIdxStart + 6 ].Value <<= pPagePrintSettings->GetHorzSpace();
aRenderer[ nRenderDataIdxStart + 7 ].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "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 = OUString( RTL_CONSTASCII_USTRINGPARAM( "NUpPaperSize" ) );
aRenderer[ nRenderDataIdxStart + 8 ].Value <<= aNewPageSize;
}
}
}
bApplyPagePrintSettingsFromXPagePrintable = sal_False;
}
m_pPrintUIOptions->appendPrintUIOptions( aRenderer );
return aRenderer;
}
/* -----------------------------28.10.02 16:00--------------------------------
---------------------------------------------------------------------------*/
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, sal_False );
// look for the view shell with the same controller in use,
// otherwise look for a suitable view
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 || pSwPagePreView )
break;
pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell, sal_False );
}
DBG_ASSERT( 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)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
if(!IsValid())
throw RuntimeException();
// 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 );
// error handling - avoid crash
if ( !bIsSwSrcView && m_pRenderData == NULL )
{
DBG_ASSERT( false, "data should have been created already in getRendererCount..." );
m_pRenderData = new SwRenderData;
}
if ( m_pPrintUIOptions == 0 )
{
DBG_ASSERT( false, "data should have been created already in getRendererCount..." );
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", sal_False );
SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport );
DBG_ASSERT( pDoc && pView, "doc or view shell missing!" );
if (pDoc && pView)
{
sal_Int32 nMaxRenderer = 0;
if (!bIsSwSrcView)
{
DBG_ASSERT( 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) !!
DBG_ASSERT( pView, "!! view missing !!" );
const TypeId aSwViewTypeId = TYPE(SwView);
ViewShell* pVwSh = 0;
if (pView)
{
// TODO/mba: we really need a generic way to get the ViewShell!
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 rtl::OUString aPageRange = m_pPrintUIOptions->getStringValue( "PageRange", OUString() );
const bool bFirstPage = m_pPrintUIOptions->getBoolValue( "IsFirstPage", sal_False );
bool bIsSkipEmptyPages = !m_pPrintUIOptions->IsPrintEmptyPages( bIsPDFExport );
DBG_ASSERT(( 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( sal_True );
// --> FME 2004-06-08 #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;
if (bIsPDFExport && bFirstPage && pWrtShell)
{
SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPageRange, bIsSkipEmptyPages, sal_False );
}
// <--
SwPrintData const& rSwPrtOptions =
*m_pRenderData->GetSwPrtOptions();
if (bPrintProspect)
pVwSh->PrintProspect( pOut, rSwPrtOptions, nRenderer );
else // normal printing and PDF export
pVwSh->PrintOrPDFExport( pOut, rSwPrtOptions, nRenderer );
// 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, sal_True );
}
pVwSh->SetPDFExportOption( sal_False );
}
}
}
}
// last page to be rendered? (not necessarily the last page of the document)
// -> do clean-up of data
if ( bLastPage )
{
CleanUpRenderingData();
}
}
/* -----------------------------03.10.04 -------------------------------------
---------------------------------------------------------------------------*/
// xforms::XFormsSupplier
Reference<XNameContainer> SAL_CALL SwXTextDocument::getXForms()
throw( RuntimeException )
{
if ( !pDocShell )
throw DisposedException( ::rtl::OUString(), static_cast< XTextDocument* >( this ) );
SwDoc* pDoc = pDocShell->GetDoc();
return pDoc->getXForms();
}
/* -----------------------------25.09.07 -------------------------------------
---------------------------------------------------------------------------*/
uno::Reference< text::XFlatParagraphIterator > SAL_CALL SwXTextDocument::getFlatParagraphIterator(::sal_Int32 nTextMarkupType, sal_Bool bAutomatic)
throw ( uno::RuntimeException )
{
return new SwXFlatParagraphIterator( *pDocShell->GetDoc(), nTextMarkupType, bAutomatic );
}
/*-- 07.05.2009 09:21:12---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Reference< util::XCloneable > SwXTextDocument::createClone( ) throw (uno::RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
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 );
}
/* -----------------------------20.06.00 09:54--------------------------------
---------------------------------------------------------------------------*/
void * SAL_CALL SwXTextDocument::operator new( size_t t) throw()
{
return SwXTextDocumentBaseClass::operator new(t);
}
/* -----------------------------20.06.00 09:54--------------------------------
---------------------------------------------------------------------------*/
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)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
// 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(::rtl::OUString::createFromAscii("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->Count(); ++i)
{
const SwAttrSet &rAttrSet = (*pFmts)[i]->GetAttrSet();
LanguageType nLang = LANGUAGE_DONTKNOW;
if (bLatin)
{
nLang = rAttrSet.GetLanguage( sal_False ).GetLanguage();
if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
aAllLangs.insert( nLang );
}
if (bAsian)
{
nLang = rAttrSet.GetCJKLanguage( sal_False ).GetLanguage();
if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
aAllLangs.insert( nLang );
}
if (bComplex)
{
nLang = rAttrSet.GetCTLLanguage( sal_False ).GetLanguage();
if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
aAllLangs.insert( nLang );
}
}
const SwTxtFmtColls *pColls = pDoc->GetTxtFmtColls();
for (sal_uInt16 i = 0; i < pColls->Count(); ++i)
{
const SwAttrSet &rAttrSet = (*pColls)[i]->GetAttrSet();
LanguageType nLang = LANGUAGE_DONTKNOW;;
if (bLatin)
{
nLang = rAttrSet.GetLanguage( sal_False ).GetLanguage();
if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
aAllLangs.insert( nLang );
}
if (bAsian)
{
nLang = rAttrSet.GetCJKLanguage( sal_False ).GetLanguage();
if (nLang != LANGUAGE_DONTKNOW && nLang != LANGUAGE_SYSTEM)
aAllLangs.insert( nLang );
}
if (bComplex)
{
nLang = rAttrSet.GetCTLLanguage( sal_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, sal_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, sal_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, sal_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_uLong nParCount = pOutliner->GetParagraphCount();
for (sal_uLong nPar=0; nPar<nParCount; nPar++)
{
//every paragraph
SvUShorts aPortions;
rEditEng.GetPortions( (sal_uInt16)nPar, aPortions );
for ( sal_uInt16 nPos = aPortions.Count(); nPos; )
{
//every position
--nPos;
sal_uInt16 nEnd = aPortions.GetObject( nPos );
sal_uInt16 nStart = nPos ? aPortions.GetObject( nPos - 1 ) : 0;
ESelection aSelection( (sal_uInt16)nPar, nStart, (sal_uInt16)nPar, nEnd );
SfxItemSet aAttr = rEditEng.GetAttribs( aSelection );
LanguageType nLang = LANGUAGE_DONTKNOW;
if (bLatin)
{
nLang = dynamic_cast< const SvxLanguageItem & >(aAttr.Get( EE_CHAR_LANGUAGE, sal_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, sal_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, sal_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
sal_Int32 nCount = 0;
uno::Sequence< lang::Locale > aLanguages( nMaxCount );
lang::Locale* pLanguage = aLanguages.getArray();
if (nMaxCount > 0)
{
const SvtLanguageTable aLangTab;
for (std::set< LanguageType >::const_iterator it = aAllLangs.begin(); it != aAllLangs.end(); ++it)
{
if (nCount >= nMaxCount)
break;
if (LANGUAGE_NONE != *it)
{
MsLangId::convertLanguageToLocale( *it, pLanguage[nCount] );
pLanguage[nCount].Language = aLangTab.GetString( *it );
nCount += 1;
}
}
}
return aLanguages;
}
// #121125#, #122868#
// method to assure clean up of the rendering data to restore view options
// and to loose hold reference to the ViewShell in SwViewOptionAdjust_Impl.
// also perform clean up for the still existing hidden frame for PDF export from Page Preview
void SwXTextDocument::CleanUpRenderingData()
{
if( m_pRenderData != NULL )
{
if ( m_pRenderData->HasPostItData() )
{
m_pRenderData->DeletePostItData();
}
delete m_pRenderData;
m_pRenderData = NULL;
}
if( m_pPrintUIOptions != NULL )
{
delete m_pPrintUIOptions;
m_pPrintUIOptions = NULL;
}
if ( IsValid() && m_pHiddenViewFrame )
{
lcl_DisposeView( m_pHiddenViewFrame, pDocShell);
m_pHiddenViewFrame = 0;
SfxItemSet *pSet = pDocShell->GetMedium()->GetItemSet();
pSet->Put( SfxBoolItem( SID_HIDDEN, sal_False ) );
}
}
/* -----------------25.10.99 11:06-------------------
--------------------------------------------------*/
SwXLinkTargetSupplier::SwXLinkTargetSupplier(SwXTextDocument& rxDoc) :
pxDoc(&rxDoc)
{
sTables = String(SW_RES(STR_CONTENT_TYPE_TABLE));
sFrames = String(SW_RES(STR_CONTENT_TYPE_FRAME));
sGraphics = String(SW_RES(STR_CONTENT_TYPE_GRAPHIC));
sOLEs = String(SW_RES(STR_CONTENT_TYPE_OLE));
sSections = String(SW_RES(STR_CONTENT_TYPE_REGION));
sOutlines = String(SW_RES(STR_CONTENT_TYPE_OUTLINE));
sBookmarks = String(SW_RES(STR_CONTENT_TYPE_BOOKMARK));
}
/* -----------------25.10.99 11:11-------------------
--------------------------------------------------*/
SwXLinkTargetSupplier::~SwXLinkTargetSupplier()
{
}
/*-- 25.10.99 11:12:45---------------------------------------------------
-----------------------------------------------------------------------*/
Any SwXLinkTargetSupplier::getByName(const OUString& rName)
throw( NoSuchElementException, WrappedTargetException, RuntimeException )
{
Any aRet;
if(!pxDoc)
throw RuntimeException();
String sToCompare(rName);
String sSuffix('|');
if(sToCompare == sTables)
{
sSuffix += UniString::CreateFromAscii(pMarkToTable);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
pxDoc->getTextTables(), sToCompare, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference<XPropertySet>*)0));
}
else if(sToCompare == sFrames)
{
sSuffix += UniString::CreateFromAscii(pMarkToFrame);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
pxDoc->getTextFrames(), sToCompare, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
}
else if(sToCompare == sSections)
{
sSuffix += UniString::CreateFromAscii(pMarkToRegion);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
pxDoc->getTextSections(), sToCompare, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
}
/* else if(sToCompare == )
{
sSuffix += UniString::CreateFromAscii(pMarkToText);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
pxDoc->, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((const XPropertySet*)0));
}*/
else if(sToCompare == sGraphics)
{
sSuffix += UniString::CreateFromAscii(pMarkToGraphic);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
pxDoc->getGraphicObjects(), sToCompare, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
}
else if(sToCompare == sOLEs)
{
sSuffix += UniString::CreateFromAscii(pMarkToOLE);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
pxDoc->getEmbeddedObjects(), sToCompare, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
}
else if(sToCompare == sOutlines)
{
sSuffix += UniString::CreateFromAscii(pMarkToOutline);
Reference< XNameAccess > xTbls = new SwXLinkNameAccessWrapper(
*pxDoc, sToCompare, sSuffix );
Reference< XPropertySet > xRet(xTbls, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
}
else if(sToCompare == sBookmarks)
{
sSuffix.Erase();
Reference< XNameAccess > xBkms = new SwXLinkNameAccessWrapper(
pxDoc->getBookmarks(), sToCompare, sSuffix );
Reference< XPropertySet > xRet(xBkms, UNO_QUERY);
aRet.setValue(&xRet, ::getCppuType((Reference< XPropertySet>*)0));
}
else
throw NoSuchElementException();
return aRet;
}
/*-- 25.10.99 11:12:46---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkTargetSupplier::getElementNames(void)
throw( RuntimeException )
{
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;
}
/*-- 25.10.99 11:12:46---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXLinkTargetSupplier::hasByName(const OUString& rName)
throw( RuntimeException )
{
String sToCompare(rName);
if( sToCompare == sTables ||
sToCompare == sFrames ||
sToCompare == sGraphics||
sToCompare == sOLEs ||
sToCompare == sSections ||
sToCompare == sOutlines ||
sToCompare == sBookmarks )
return sal_True;
return sal_False;
}
/*-- 25.10.99 11:12:47---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Type SwXLinkTargetSupplier::getElementType(void)
throw( RuntimeException )
{
return ::getCppuType((Reference< XPropertySet>*)0);
}
/*-- 25.10.99 11:12:47---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXLinkTargetSupplier::hasElements(void) throw( RuntimeException )
{
return 0 != pxDoc;
}
/*-- 25.10.99 11:12:47---------------------------------------------------
-----------------------------------------------------------------------*/
OUString SwXLinkTargetSupplier::getImplementationName(void) throw( RuntimeException )
{
return C2U("SwXLinkTargetSupplier");
}
/*-- 25.10.99 11:12:48---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXLinkTargetSupplier::supportsService(const OUString& rServiceName)
throw( RuntimeException )
{
return (rServiceName == C2U("com.sun.star.document.LinkTargets"));
}
/*-- 25.10.99 11:12:48---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkTargetSupplier::getSupportedServiceNames(void)
throw( RuntimeException )
{
Sequence< OUString > aRet(1);
OUString* pNames = aRet.getArray();
pNames[0] = C2U("com.sun.star.document.LinkTargets");
return aRet;
}
/*-- 26.10.99 09:16:23---------------------------------------------------
-----------------------------------------------------------------------*/
SwXLinkNameAccessWrapper::SwXLinkNameAccessWrapper(
Reference< XNameAccess > xAccess, const String& rLinkDisplayName, String sSuffix ) :
xRealAccess(xAccess),
pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_LINK_TARGET)),
sLinkSuffix(sSuffix),
sLinkDisplayName(rLinkDisplayName),
pxDoc(0)
{
}
/* -----------------26.10.99 14:17-------------------
--------------------------------------------------*/
SwXLinkNameAccessWrapper::SwXLinkNameAccessWrapper(SwXTextDocument& rxDoc,
const String& rLinkDisplayName, String sSuffix) :
pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_LINK_TARGET)),
sLinkSuffix(sSuffix),
sLinkDisplayName(rLinkDisplayName),
xDoc(&rxDoc),
pxDoc(&rxDoc)
{
}
/*-- 26.10.99 09:16:23---------------------------------------------------
-----------------------------------------------------------------------*/
SwXLinkNameAccessWrapper::~SwXLinkNameAccessWrapper()
{
}
/*-- 26.10.99 09:16:24---------------------------------------------------
-----------------------------------------------------------------------*/
Any SwXLinkNameAccessWrapper::getByName(const OUString& rName)
throw( NoSuchElementException, WrappedTargetException, RuntimeException )
{
Any aRet;
sal_Bool bFound = sal_False;
//cut link extension and call the real NameAccess
String sParam = rName;
String sSuffix(sLinkSuffix);
if(sParam.Len() > sSuffix.Len() )
{
String sCmp = sParam.Copy(sParam.Len() - sSuffix.Len(),
sSuffix.Len());
if(sCmp == sSuffix)
{
if(pxDoc)
{
sParam = sParam.Copy(0, sParam.Len() - sSuffix.Len());
if(!pxDoc->GetDocShell())
throw RuntimeException();
SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc();
sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().Count();
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, ::getCppuType((Reference<XPropertySet>*)0));
bFound = sal_True;
}
}
}
else
{
aRet = xRealAccess->getByName(sParam.Copy(0, sParam.Len() - sSuffix.Len()));
Reference< XInterface > xInt;
if(!(aRet >>= xInt))
throw RuntimeException();
Reference< XPropertySet > xProp(xInt, UNO_QUERY);
aRet <<= xProp;
bFound = sal_True;
}
}
}
if(!bFound)
throw NoSuchElementException();
return aRet;
}
/*-- 26.10.99 09:16:24---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkNameAccessWrapper::getElementNames(void)
throw( RuntimeException )
{
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.Count();
aRet.realloc(nOutlineCount);
OUString* pResArr = aRet.getArray();
String sSuffix('|');
sSuffix += UniString::CreateFromAscii(pMarkToOutline);
const SwNumRule* pOutlRule = pDoc->GetOutlineNumRule();
for (sal_uInt16 i = 0; i < nOutlineCount; ++i)
{
String 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;
}
/*-- 26.10.99 09:16:25---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXLinkNameAccessWrapper::hasByName(const OUString& rName)
throw( RuntimeException )
{
sal_Bool bRet = sal_False;
String sParam(rName);
if(sParam.Len() > sLinkSuffix.Len() )
{
String sCmp = sParam.Copy(sParam.Len() - sLinkSuffix.Len(),
sLinkSuffix.Len());
if(sCmp == sLinkSuffix)
{
sParam = sParam.Copy(0, sParam.Len() - sLinkSuffix.Len());
if(pxDoc)
{
if(!pxDoc->GetDocShell())
throw RuntimeException();
SwDoc* pDoc = pxDoc->GetDocShell()->GetDoc();
sal_uInt16 nOutlineCount = pDoc->GetNodes().GetOutLineNds().Count();
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 = sal_True;
}
}
}
else
{
bRet = xRealAccess->hasByName(sParam);
}
}
}
return bRet;
}
/*-- 26.10.99 09:16:25---------------------------------------------------
-----------------------------------------------------------------------*/
uno::Type SwXLinkNameAccessWrapper::getElementType(void)
throw( RuntimeException )
{
return ::getCppuType((Reference<XPropertySet>*)0);
}
/*-- 26.10.99 09:16:25---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXLinkNameAccessWrapper::hasElements(void) throw( RuntimeException )
{
sal_Bool bRet = sal_False;
if(pxDoc)
{
DBG_ERROR("not implemented");
}
else
{
bRet = xRealAccess->hasElements();
}
return bRet;
}
/*-- 26.10.99 09:16:26---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XPropertySetInfo > SwXLinkNameAccessWrapper::getPropertySetInfo(void)
throw( RuntimeException )
{
static Reference< XPropertySetInfo > xRet = pPropSet->getPropertySetInfo();
return xRet;
}
/*-- 26.10.99 09:16:26---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::setPropertyValue(
const OUString& , const Any& )
throw( UnknownPropertyException,
PropertyVetoException,
IllegalArgumentException,
WrappedTargetException,
RuntimeException)
{
throw UnknownPropertyException();
}
/* -----------------------------08.12.99 11:10--------------------------------
---------------------------------------------------------------------------*/
Any lcl_GetDisplayBitmap(String sLinkSuffix)
{
Any aRet;
if(sLinkSuffix.Len())
sLinkSuffix.Erase(0, 1);
sal_uInt16 nImgId = USHRT_MAX;
if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToOutline))
nImgId = CONTENT_TYPE_OUTLINE;
else if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToTable))
nImgId = CONTENT_TYPE_TABLE;
else if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToFrame))
nImgId = CONTENT_TYPE_FRAME;
else if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToGraphic))
nImgId = CONTENT_TYPE_GRAPHIC;
// else if(== sLinkSuffix)
// nImgId = CONTENT_TYPE_BOOKMARK;
else if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToRegion))
nImgId = CONTENT_TYPE_REGION;
else if(COMPARE_EQUAL == sLinkSuffix.CompareToAscii(pMarkToOLE))
nImgId = CONTENT_TYPE_OLE;
else if(!sLinkSuffix.Len())
nImgId = CONTENT_TYPE_BOOKMARK;
if(USHRT_MAX != nImgId)
{
nImgId += 20000;
sal_Bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
ImageList aEntryImages( SW_RES(bHighContrast ? IMG_NAVI_ENTRYBMPH : IMG_NAVI_ENTRYBMP) );
const Image& rImage = aEntryImages.GetImage( nImgId );
Bitmap aBitmap( rImage.GetBitmapEx().GetBitmap() );
Reference<awt::XBitmap> xBmp = VCLUnoHelper::CreateBitmap( aBitmap );
aRet.setValue( &xBmp, ::getCppuType((Reference<awt::XBitmap>*)0) );
}
return aRet;
}
/*-- 26.10.99 09:16:27---------------------------------------------------
-----------------------------------------------------------------------*/
Any SwXLinkNameAccessWrapper::getPropertyValue(const OUString& rPropertyName)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
Any aRet;
if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_LINK_DISPLAY_NAME)))
{
aRet <<= OUString(sLinkDisplayName);
}
else if( rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_LINK_DISPLAY_BITMAP)))
{
aRet = lcl_GetDisplayBitmap(sLinkSuffix);
}
else
throw UnknownPropertyException();
return aRet;
}
/*-- 26.10.99 09:16:27---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::addPropertyChangeListener(
const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:28---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::removePropertyChangeListener(
const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:28---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::addVetoableChangeListener(
const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:29---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXLinkNameAccessWrapper::removeVetoableChangeListener(
const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{}
/*-- 26.10.99 09:16:32---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XNameAccess > SwXLinkNameAccessWrapper::getLinks(void)
throw( RuntimeException )
{
return (SwXLinkNameAccessWrapper*)this;
}
/*-- 26.10.99 09:21:48---------------------------------------------------
-----------------------------------------------------------------------*/
OUString SwXLinkNameAccessWrapper::getImplementationName(void) throw( RuntimeException )
{
return C2U("SwXLinkNameAccessWrapper");
}
/*-- 26.10.99 09:21:48---------------------------------------------------
-----------------------------------------------------------------------*/
sal_Bool SwXLinkNameAccessWrapper::supportsService(const OUString& rServiceName)
throw( RuntimeException )
{
return (rServiceName == C2U("com.sun.star.document.LinkTargets"));
}
/*-- 26.10.99 09:21:48---------------------------------------------------
-----------------------------------------------------------------------*/
Sequence< OUString > SwXLinkNameAccessWrapper::getSupportedServiceNames(void)
throw( RuntimeException )
{
Sequence< OUString > aRet(1);
OUString* pNames = aRet.getArray();
pNames[0] = C2U("com.sun.star.document.LinkTargets");
return aRet;
}
/* -----------------26.10.99 15:50-------------------
--------------------------------------------------*/
SwXOutlineTarget::SwXOutlineTarget(const String& rOutlineText) :
pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_LINK_TARGET)),
sOutlineText(rOutlineText)
{
}
/*-- 26.10.99 15:51:45---------------------------------------------------
-----------------------------------------------------------------------*/
SwXOutlineTarget::~SwXOutlineTarget()
{
}
/*-- 26.10.99 15:51:46---------------------------------------------------
-----------------------------------------------------------------------*/
Reference< XPropertySetInfo > SwXOutlineTarget::getPropertySetInfo(void) throw( RuntimeException )
{
static Reference< XPropertySetInfo > xRet = pPropSet->getPropertySetInfo();
return xRet;
}
/*-- 26.10.99 15:51:46---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXOutlineTarget::setPropertyValue(
const OUString& /*PropertyName*/, const Any& /*aValue*/)
throw( UnknownPropertyException, PropertyVetoException,
IllegalArgumentException, WrappedTargetException, RuntimeException)
{
throw UnknownPropertyException();
}
/*-- 26.10.99 15:51:46---------------------------------------------------
-----------------------------------------------------------------------*/
Any SwXOutlineTarget::getPropertyValue(const OUString& rPropertyName)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
Any aRet;
if(rPropertyName.equalsAsciiL( SW_PROP_NAME(UNO_LINK_DISPLAY_NAME)))
aRet <<= OUString(sOutlineText);
else
throw UnknownPropertyException();
return aRet;
}
/*-- 26.10.99 15:51:46---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXOutlineTarget::addPropertyChangeListener(
const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/*-- 26.10.99 15:51:47---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXOutlineTarget::removePropertyChangeListener(
const OUString& /*PropertyName*/, const Reference< XPropertyChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/*-- 26.10.99 15:51:47---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXOutlineTarget::addVetoableChangeListener(
const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/*-- 26.10.99 15:51:47---------------------------------------------------
-----------------------------------------------------------------------*/
void SwXOutlineTarget::removeVetoableChangeListener(
const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener > & /*aListener*/)
throw( UnknownPropertyException, WrappedTargetException, RuntimeException )
{
}
/* -----------------03.05.99 12:28-------------------
*
* --------------------------------------------------*/
OUString SwXOutlineTarget::getImplementationName(void) throw( RuntimeException )
{
return C2U("SwXOutlineTarget");
}
/* -----------------03.05.99 12:28-------------------
*
* --------------------------------------------------*/
sal_Bool SwXOutlineTarget::supportsService(const OUString& ServiceName) throw( RuntimeException )
{
return C2U("com.sun.star.document.LinkTarget") == ServiceName;
}
/* -----------------03.05.99 12:28-------------------
*
* --------------------------------------------------*/
Sequence< OUString > SwXOutlineTarget::getSupportedServiceNames(void) throw( RuntimeException )
{
Sequence < OUString > aRet(1);
OUString* pArray = aRet.getArray();
pArray[0] = C2U("com.sun.star.document.LinkTarget");
return aRet;
}
/* -----------------------------17.01.01 16:06--------------------------------
---------------------------------------------------------------------------*/
SwXDocumentPropertyHelper::SwXDocumentPropertyHelper(SwDoc& rDoc) :
SvxUnoForbiddenCharsTable ( rDoc.getForbiddenCharacterTable() )
,m_pDoc(&rDoc)
{
}
/* -----------------------------17.01.01 16:06--------------------------------
---------------------------------------------------------------------------*/
SwXDocumentPropertyHelper::~SwXDocumentPropertyHelper()
{
}
/* -----------------------------17.01.01 16:06--------------------------------
---------------------------------------------------------------------------*/
Reference<XInterface> SwXDocumentPropertyHelper::GetDrawTable(short nWhich)
{
Reference<XInterface> xRet;
if(m_pDoc)
{
switch(nWhich)
{
// --> OD 2005-08-08 #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;
#ifdef DBG_UTIL
default: DBG_ERROR("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.unbind();
}
/* -----------------13.08.2003 12:43-----------------
--------------------------------------------------*/
void SwXDocumentPropertyHelper::onChange()
{
if(m_pDoc)
m_pDoc->SetModified();
}
/*****************************************************************************/
SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl( ViewShell& rSh, const SwViewOption &rViewOptions ) :
m_rShell( rSh ),
m_aOldViewOptions( rViewOptions )
{
}
SwViewOptionAdjust_Impl::~SwViewOptionAdjust_Impl()
{
m_rShell.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_rShell.GetDoc()->ContainsHiddenChars();
const SwFieldType* pFldType = m_rShell.GetDoc()->GetSysFldType( RES_HIDDENTXTFLD );
const bool bContainsHiddenFields = pFldType && pFldType->GetDepends();
pFldType = m_rShell.GetDoc()->GetSysFldType( RES_HIDDENPARAFLD );
const bool bContainsHiddenParagraphs = pFldType && pFldType->GetDepends();
pFldType = m_rShell.GetDoc()->GetSysFldType( RES_JUMPEDITFLD );
const bool bContainsPlaceHolders = pFldType && pFldType->GetDepends();
const bool bContainsFields = m_rShell.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( sal_False ); // paragraph end
aRenderViewOptions.SetSoftHyph( sal_False ); // aka custom hyphens
aRenderViewOptions.SetBlank( sal_False ); // spaces
aRenderViewOptions.SetHardBlank( sal_False ); // non-breaking spaces
aRenderViewOptions.SetTab( sal_False ); // tabs
aRenderViewOptions.SetLineBreak( sal_False ); // breaks (type 1)
aRenderViewOptions.SetPageBreak( sal_False ); // breaks (type 2)
aRenderViewOptions.SetColumnBreak( sal_False ); // breaks (type 3)
sal_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( sal_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( sal_True );
if (m_aOldViewOptions != aRenderViewOptions) // check if reformatting is necessary
{
aRenderViewOptions.SetPrinting( pPrtOptions != NULL );
m_rShell.ApplyViewOptions( aRenderViewOptions );
}
}
/*****************************************************************************/