diff options
Diffstat (limited to 'sw/source/core/doc/doc.cxx')
-rw-r--r-- | sw/source/core/doc/doc.cxx | 2742 |
1 files changed, 0 insertions, 2742 deletions
diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx deleted file mode 100644 index 28f5bc4071..0000000000 --- a/sw/source/core/doc/doc.cxx +++ /dev/null @@ -1,2742 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sw.hxx" - -#include <doc.hxx> -#include <UndoManager.hxx> -#include <hintids.hxx> - -#include <tools/shl.hxx> -#include <tools/globname.hxx> -#include <svx/svxids.hrc> -#include <com/sun/star/i18n/WordType.hdl> -#include <com/sun/star/i18n/ForbiddenCharacters.hdl> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/beans/NamedValue.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> -#include <com/sun/star/document/XDocumentProperties.hpp> -#include <comphelper/processfactory.hxx> -#include <tools/urlobj.hxx> -#include <tools/poly.hxx> -#include <tools/multisel.hxx> -#include <rtl/ustring.hxx> -#include <vcl/virdev.hxx> -#include <svl/itemiter.hxx> -#include <svl/poolitem.hxx> -#include <unotools/syslocale.hxx> -#include <sfx2/printer.hxx> -#include <editeng/keepitem.hxx> -#include <editeng/cscoitem.hxx> -#include <editeng/brkitem.hxx> -#include <sfx2/linkmgr.hxx> -#include <editeng/forbiddencharacterstable.hxx> -#include <svx/svdmodel.hxx> -#include <editeng/pbinitem.hxx> -#include <unotools/charclass.hxx> -#include <unotools/localedatawrapper.hxx> - -#include <swatrset.hxx> -#include <swmodule.hxx> -#include <fmtpdsc.hxx> -#include <fmtanchr.hxx> -#include <fmtrfmrk.hxx> -#include <fmtinfmt.hxx> -#include <fmtfld.hxx> -#include <txtfld.hxx> -#include <dbfld.hxx> -#include <txtinet.hxx> -#include <txtrfmrk.hxx> -#include <frmatr.hxx> -#include <linkenum.hxx> -#include <pagefrm.hxx> -#include <rootfrm.hxx> -#include <swtable.hxx> -#include <pam.hxx> -#include <ndtxt.hxx> -#include <swundo.hxx> // fuer die UndoIds -#include <UndoCore.hxx> -#include <UndoInsert.hxx> -#include <UndoSplitMove.hxx> -#include <UndoTable.hxx> -#include <pagedesc.hxx> //DTor -#include <breakit.hxx> -#include <ndole.hxx> -#include <ndgrf.hxx> -#include <rolbck.hxx> // Undo-Attr -#include <doctxm.hxx> // fuer die Verzeichnisse -#include <grfatr.hxx> -#include <poolfmt.hxx> // PoolVorlagen-Id's -#include <mvsave.hxx> // fuer Server-Funktionalitaet -#include <SwGrammarMarkUp.hxx> -#include <scriptinfo.hxx> -#include <acorrect.hxx> // Autokorrektur -#include <mdiexp.hxx> // Statusanzeige -#include <docstat.hxx> -#include <docary.hxx> -#include <redline.hxx> -#include <fldupde.hxx> -#include <swbaslnk.hxx> -#include <printdata.hxx> -#include <cmdid.h> // fuer den dflt - Printer in SetJob -#include <statstr.hrc> // StatLine-String -#include <comcore.hrc> -#include <SwUndoTOXChange.hxx> -#include <SwUndoFmt.hxx> -#include <unocrsr.hxx> -#include <docsh.hxx> -#include <viewopt.hxx> -#include <docfld.hxx> // _SetGetExpFld -#include <docufld.hxx> // SwPostItField -#include <viewsh.hxx> -#include <shellres.hxx> -#include <txtfrm.hxx> -#include <attrhint.hxx> - -#include <wdocsh.hxx> // SwWebDocShell -#include <prtopt.hxx> // SwPrintOptions - -#include <vector> -#include <map> - -#include <osl/diagnose.h> -#include <osl/interlck.h> -#include <vbahelper/vbaaccesshelper.hxx> - -#include "switerator.hxx" - -/* @@@MAINTAINABILITY-HORROR@@@ - Probably unwanted dependency on SwDocShell -*/ -#include <layouter.hxx> - -using namespace ::com::sun::star; -using ::rtl::OUString; - -// Seiten-Deskriptoren -SV_IMPL_PTRARR(SwPageDescs,SwPageDescPtr); -// Verzeichnisse -SV_IMPL_PTRARR( SwTOXTypes, SwTOXTypePtr ) -// FeldTypen -SV_IMPL_PTRARR( SwFldTypes, SwFldTypePtr) - -/* IInterface */ -sal_Int32 SwDoc::acquire() -{ - OSL_ENSURE(mReferenceCount >= 0, "Negative reference count detected! This is a sign for unbalanced acquire/release calls."); - return osl_incrementInterlockedCount(&mReferenceCount); -} - -sal_Int32 SwDoc::release() -{ - OSL_PRECOND(mReferenceCount >= 1, "Object is already released! Releasing it again leads to a negative reference count."); - return osl_decrementInterlockedCount(&mReferenceCount); -} - -sal_Int32 SwDoc::getReferenceCount() const -{ - OSL_ENSURE(mReferenceCount >= 0, "Negative reference count detected! This is a sign for unbalanced acquire/release calls."); - return mReferenceCount; -} - -/* IDocumentSettingAccess */ -bool SwDoc::get(/*[in]*/ DocumentSettingId id) const -{ - switch (id) - { - // COMPATIBILITY FLAGS START - case PARA_SPACE_MAX: return mbParaSpaceMax; //(n8Dummy1 & DUMMY_PARASPACEMAX); - case PARA_SPACE_MAX_AT_PAGES: return mbParaSpaceMaxAtPages; //(n8Dummy1 & DUMMY_PARASPACEMAX_AT_PAGES); - case TAB_COMPAT: return mbTabCompat; //(n8Dummy1 & DUMMY_TAB_COMPAT); - case ADD_FLY_OFFSETS: return mbAddFlyOffsets; //(n8Dummy2 & DUMMY_ADD_FLY_OFFSETS); - case ADD_EXT_LEADING: return mbAddExternalLeading; //(n8Dummy2 & DUMMY_ADD_EXTERNAL_LEADING); - case USE_VIRTUAL_DEVICE: return mbUseVirtualDevice; //(n8Dummy1 & DUMMY_USE_VIRTUAL_DEVICE); - case USE_HIRES_VIRTUAL_DEVICE: return mbUseHiResolutionVirtualDevice; //(n8Dummy2 & DUMMY_USE_HIRES_VIR_DEV); - case OLD_NUMBERING: return mbOldNumbering; - case OLD_LINE_SPACING: return mbOldLineSpacing; - case ADD_PARA_SPACING_TO_TABLE_CELLS: return mbAddParaSpacingToTableCells; - case USE_FORMER_OBJECT_POS: return mbUseFormerObjectPos; - case USE_FORMER_TEXT_WRAPPING: return mbUseFormerTextWrapping; - case CONSIDER_WRAP_ON_OBJECT_POSITION: return mbConsiderWrapOnObjPos; - case DO_NOT_JUSTIFY_LINES_WITH_MANUAL_BREAK: return mbDoNotJustifyLinesWithManualBreak; - case IGNORE_FIRST_LINE_INDENT_IN_NUMBERING: return mbIgnoreFirstLineIndentInNumbering; - case OUTLINE_LEVEL_YIELDS_OUTLINE_RULE: return mbOutlineLevelYieldsOutlineRule; - case TABLE_ROW_KEEP: return mbTableRowKeep; - case IGNORE_TABS_AND_BLANKS_FOR_LINE_CALCULATION: return mbIgnoreTabsAndBlanksForLineCalculation; - case DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE: return mbDoNotCaptureDrawObjsOnPage; - // #i68949# - case CLIP_AS_CHARACTER_ANCHORED_WRITER_FLY_FRAME: return mbClipAsCharacterAnchoredWriterFlyFrames; - case UNIX_FORCE_ZERO_EXT_LEADING: return mbUnixForceZeroExtLeading; - case USE_OLD_PRINTER_METRICS: return mbOldPrinterMetrics; - case TABS_RELATIVE_TO_INDENT : return mbTabRelativeToIndent; - case PROTECT_FORM: return mbProtectForm; - // #i89181# - case TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: return mbTabAtLeftIndentForParagraphsInList; - case INVERT_BORDER_SPACING: return mbInvertBorderSpacing; - case COLLAPSE_EMPTY_CELL_PARA: return mbCollapseEmptyCellPara; - case SMALL_CAPS_PERCENTAGE_66: return mbSmallCapsPercentage66; - - case BROWSE_MODE: return mbLastBrowseMode; // Attention: normally the ViewShell has to be asked! - case HTML_MODE: return mbHTMLMode; - case GLOBAL_DOCUMENT: return mbIsGlobalDoc; - case GLOBAL_DOCUMENT_SAVE_LINKS: return mbGlblDocSaveLinks; - case LABEL_DOCUMENT: return mbIsLabelDoc; - case PURGE_OLE: return mbPurgeOLE; - case KERN_ASIAN_PUNCTUATION: return mbKernAsianPunctuation; - case DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT: return mbDoNotResetParaAttrsForNumFont; - case MATH_BASELINE_ALIGNMENT: return mbMathBaselineAlignment; - default: - OSL_FAIL("Invalid setting id"); - } - return false; -} - -void SwDoc::set(/*[in]*/ DocumentSettingId id, /*[in]*/ bool value) -{ - switch (id) - { - // COMPATIBILITY FLAGS START - case PARA_SPACE_MAX: - mbParaSpaceMax = value; - break; - case PARA_SPACE_MAX_AT_PAGES: - mbParaSpaceMaxAtPages = value; - break; - case TAB_COMPAT: - mbTabCompat = value; - break; - case ADD_FLY_OFFSETS: - mbAddFlyOffsets = value; - break; - case ADD_EXT_LEADING: - mbAddExternalLeading = value; - break; - case USE_VIRTUAL_DEVICE: - mbUseVirtualDevice = value; - break; - case USE_HIRES_VIRTUAL_DEVICE: - mbUseHiResolutionVirtualDevice = value; - break; - case OLD_NUMBERING: - if (mbOldNumbering != value) - { - mbOldNumbering = value; - - const SwNumRuleTbl& rNmTbl = GetNumRuleTbl(); - for( sal_uInt16 n = 0; n < rNmTbl.Count(); ++n ) - rNmTbl[n]->SetInvalidRule(sal_True); - - UpdateNumRule(); - - if (pOutlineRule) - { - pOutlineRule->Validate(); - // counting of phantoms depends on <IsOldNumbering()> - pOutlineRule->SetCountPhantoms( !mbOldNumbering ); - } - } - break; - case OLD_LINE_SPACING: - mbOldLineSpacing = value; - break; - case ADD_PARA_SPACING_TO_TABLE_CELLS: - mbAddParaSpacingToTableCells = value; - break; - case USE_FORMER_OBJECT_POS: - mbUseFormerObjectPos = value; - break; - case USE_FORMER_TEXT_WRAPPING: - mbUseFormerTextWrapping = value; - break; - case CONSIDER_WRAP_ON_OBJECT_POSITION: - mbConsiderWrapOnObjPos = value; - break; - case DO_NOT_JUSTIFY_LINES_WITH_MANUAL_BREAK: - mbDoNotJustifyLinesWithManualBreak = value; - break; - case IGNORE_FIRST_LINE_INDENT_IN_NUMBERING: - mbIgnoreFirstLineIndentInNumbering = value; - break; - - case OUTLINE_LEVEL_YIELDS_OUTLINE_RULE: - mbOutlineLevelYieldsOutlineRule = value; - break; - - case TABLE_ROW_KEEP: - mbTableRowKeep = value; - break; - - case IGNORE_TABS_AND_BLANKS_FOR_LINE_CALCULATION: - mbIgnoreTabsAndBlanksForLineCalculation = value; - break; - - case DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE: - mbDoNotCaptureDrawObjsOnPage = value; - break; - - // #i68949# - case CLIP_AS_CHARACTER_ANCHORED_WRITER_FLY_FRAME: - mbClipAsCharacterAnchoredWriterFlyFrames = value; - break; - - case UNIX_FORCE_ZERO_EXT_LEADING: - mbUnixForceZeroExtLeading = value; - break; - - case PROTECT_FORM: - mbProtectForm = value; - break; - - case USE_OLD_PRINTER_METRICS: - mbOldPrinterMetrics = value; - break; - case TABS_RELATIVE_TO_INDENT: - mbTabRelativeToIndent = value; - break; - // #i89181# - case TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: - mbTabAtLeftIndentForParagraphsInList = value; - break; - - case INVERT_BORDER_SPACING: - mbInvertBorderSpacing = value; - break; - - case COLLAPSE_EMPTY_CELL_PARA: - mbCollapseEmptyCellPara = value; - break; - - case SMALL_CAPS_PERCENTAGE_66: - mbSmallCapsPercentage66 = value; - break; - // COMPATIBILITY FLAGS END - - case BROWSE_MODE: //can be used temporary (load/save) when no ViewShell is avaiable - mbLastBrowseMode = value; - break; - - case HTML_MODE: - mbHTMLMode = value; - break; - - case GLOBAL_DOCUMENT: - mbIsGlobalDoc = value; - break; - - case GLOBAL_DOCUMENT_SAVE_LINKS: - mbGlblDocSaveLinks = value; - break; - - case LABEL_DOCUMENT: - mbIsLabelDoc = value; - break; - - case PURGE_OLE: - mbPurgeOLE = value; - break; - - case KERN_ASIAN_PUNCTUATION: - mbKernAsianPunctuation = value; - break; - - case DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT: - mbDoNotResetParaAttrsForNumFont = value; - break; - case MATH_BASELINE_ALIGNMENT: - mbMathBaselineAlignment = value; - break; - default: - OSL_FAIL("Invalid setting id"); - } -} - -const i18n::ForbiddenCharacters* - SwDoc::getForbiddenCharacters(/*[in]*/ sal_uInt16 nLang, /*[in]*/ bool bLocaleData ) const -{ - const i18n::ForbiddenCharacters* pRet = 0; - if( xForbiddenCharsTable.is() ) - pRet = xForbiddenCharsTable->GetForbiddenCharacters( nLang, sal_False ); - if( bLocaleData && !pRet && pBreakIt ) - pRet = &pBreakIt->GetForbidden( (LanguageType)nLang ); - return pRet; -} - -void SwDoc::setForbiddenCharacters(/*[in]*/ sal_uInt16 nLang, - /*[in]*/ const com::sun::star::i18n::ForbiddenCharacters& rFChars ) -{ - if( !xForbiddenCharsTable.is() ) - { - uno::Reference< - lang::XMultiServiceFactory > xMSF = - ::comphelper::getProcessServiceFactory(); - xForbiddenCharsTable = new SvxForbiddenCharactersTable( xMSF ); - } - xForbiddenCharsTable->SetForbiddenCharacters( nLang, rFChars ); - if( pDrawModel ) - { - pDrawModel->SetForbiddenCharsTable( xForbiddenCharsTable ); - if( !mbInReading ) - pDrawModel->ReformatAllTextObjects(); - } - - SwRootFrm* pTmpRoot = GetCurrentLayout(); - if( pTmpRoot && !mbInReading ) - { - pTmpRoot->StartAllAction(); - std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); - std::for_each( aAllLayouts.begin(), aAllLayouts.end(), std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_SIZE)); - pTmpRoot->EndAllAction(); - }//swmod 080310 - SetModified(); -} - -rtl::Reference<SvxForbiddenCharactersTable>& SwDoc::getForbiddenCharacterTable() -{ - if( !xForbiddenCharsTable.is() ) - { - uno::Reference< - lang::XMultiServiceFactory > xMSF = - ::comphelper::getProcessServiceFactory(); - xForbiddenCharsTable = new SvxForbiddenCharactersTable( xMSF ); - } - return xForbiddenCharsTable; -} - -const rtl::Reference<SvxForbiddenCharactersTable>& SwDoc::getForbiddenCharacterTable() const -{ - return xForbiddenCharsTable; -} - -sal_uInt16 SwDoc::getLinkUpdateMode( /*[in]*/bool bGlobalSettings ) const -{ - sal_uInt16 nRet = nLinkUpdMode; - if( bGlobalSettings && GLOBALSETTING == nRet ) - nRet = SW_MOD()->GetLinkUpdMode(get(IDocumentSettingAccess::HTML_MODE)); - return nRet; -} - -void SwDoc::setLinkUpdateMode( /*[in]*/sal_uInt16 eMode ) -{ - nLinkUpdMode = eMode; -} - -SwFldUpdateFlags SwDoc::getFieldUpdateFlags( /*[in]*/bool bGlobalSettings ) const -{ - SwFldUpdateFlags eRet = eFldUpdMode; - if( bGlobalSettings && AUTOUPD_GLOBALSETTING == eRet ) - eRet = SW_MOD()->GetFldUpdateFlags(get(IDocumentSettingAccess::HTML_MODE)); - return eRet; -} - -void SwDoc::setFieldUpdateFlags(/*[in]*/SwFldUpdateFlags eMode ) -{ - eFldUpdMode = eMode; -} - -SwCharCompressType SwDoc::getCharacterCompressionType() const -{ - return eChrCmprType; -} - -void SwDoc::setCharacterCompressionType( /*[in]*/SwCharCompressType n ) -{ - if( eChrCmprType != n ) - { - eChrCmprType = n; - if( pDrawModel ) - { - pDrawModel->SetCharCompressType( static_cast<sal_uInt16>(n) ); - if( !mbInReading ) - pDrawModel->ReformatAllTextObjects(); - } - - SwRootFrm* pTmpRoot = GetCurrentLayout(); - if( pTmpRoot && !mbInReading ) - { - pTmpRoot->StartAllAction(); - std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); - std::for_each( aAllLayouts.begin(), aAllLayouts.end(), std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_SIZE)); - pTmpRoot->EndAllAction(); - }//swmod 080310 - SetModified(); - } -} - -/* IDocumentDeviceAccess */ -SfxPrinter* SwDoc::getPrinter(/*[in]*/ bool bCreate ) const -{ - SfxPrinter* pRet = 0; - if ( !bCreate || pPrt ) - pRet = pPrt; - else - pRet = &CreatePrinter_(); - - return pRet; -} - -void SwDoc::setPrinter(/*[in]*/ SfxPrinter *pP,/*[in]*/ bool bDeleteOld,/*[in]*/ bool bCallPrtDataChanged ) -{ - if ( pP != pPrt ) - { - if ( bDeleteOld ) - delete pPrt; - pPrt = pP; - - // our printer should always use TWIP. Don't rely on this being set in ViewShell::InitPrt, there - // are situations where this isn't called. - // #i108712# / 2010-02-26 / frank.schoenheit@sun.com - if ( pPrt ) - { - MapMode aMapMode( pPrt->GetMapMode() ); - aMapMode.SetMapUnit( MAP_TWIP ); - pPrt->SetMapMode( aMapMode ); - } - - if ( pDrawModel && !get( IDocumentSettingAccess::USE_VIRTUAL_DEVICE ) ) - pDrawModel->SetRefDevice( pPrt ); - } - - if ( bCallPrtDataChanged && - // #i41075# Do not call PrtDataChanged() if we do not - // use the printer for formatting: - !get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE) ) - PrtDataChanged(); -} - -VirtualDevice* SwDoc::getVirtualDevice(/*[in]*/ bool bCreate ) const -{ - VirtualDevice* pRet = 0; - if ( !bCreate || pVirDev ) - pRet = pVirDev; - else - pRet = &CreateVirtualDevice_(); - - return pRet; -} - -void SwDoc::setVirtualDevice(/*[in]*/ VirtualDevice* pVd,/*[in]*/ bool bDeleteOld, /*[in]*/ bool ) -{ - if ( pVirDev != pVd ) - { - if ( bDeleteOld ) - delete pVirDev; - pVirDev = pVd; - - if ( pDrawModel && get( IDocumentSettingAccess::USE_VIRTUAL_DEVICE ) ) - pDrawModel->SetRefDevice( pVirDev ); - } -} - -OutputDevice* SwDoc::getReferenceDevice(/*[in]*/ bool bCreate ) const -{ - OutputDevice* pRet = 0; - if ( !get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE) ) - { - pRet = getPrinter( bCreate ); - - if ( bCreate && !pPrt->IsValid() ) - { - pRet = getVirtualDevice( sal_True ); - } - } - else - { - pRet = getVirtualDevice( bCreate ); - } - - return pRet; -} - -void SwDoc::setReferenceDeviceType(/*[in]*/ bool bNewVirtual,/*[in]*/ bool bNewHiRes ) -{ - if ( get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE) != bNewVirtual || - get(IDocumentSettingAccess::USE_HIRES_VIRTUAL_DEVICE) != bNewHiRes ) - { - if ( bNewVirtual ) - { - VirtualDevice* pMyVirDev = getVirtualDevice( true ); - if ( !bNewHiRes ) - pMyVirDev->SetReferenceDevice( VirtualDevice::REFDEV_MODE06 ); - else - pMyVirDev->SetReferenceDevice( VirtualDevice::REFDEV_MODE_MSO1 ); - - if( pDrawModel ) - pDrawModel->SetRefDevice( pMyVirDev ); - } - else - { - // #i41075# - // We have to take care that a printer exists before calling - // PrtDataChanged() in order to prevent that PrtDataChanged() - // triggers this funny situation: - // getReferenceDevice()->getPrinter()->CreatePrinter_() - // ->setPrinter()-> PrtDataChanged() - SfxPrinter* pPrinter = getPrinter( true ); - if( pDrawModel ) - pDrawModel->SetRefDevice( pPrinter ); - } - - set(IDocumentSettingAccess::USE_VIRTUAL_DEVICE, bNewVirtual ); - set(IDocumentSettingAccess::USE_HIRES_VIRTUAL_DEVICE, bNewHiRes ); - PrtDataChanged(); - SetModified(); - } -} - -const JobSetup* SwDoc::getJobsetup() const -{ - return pPrt ? &pPrt->GetJobSetup() : 0; -} - -void SwDoc::setJobsetup(/*[in]*/ const JobSetup &rJobSetup ) -{ - sal_Bool bCheckPageDescs = 0 == pPrt; - sal_Bool bDataChanged = sal_False; - - if ( pPrt ) - { - if ( pPrt->GetName() == rJobSetup.GetPrinterName() ) - { - if ( pPrt->GetJobSetup() != rJobSetup ) - { - pPrt->SetJobSetup( rJobSetup ); - bDataChanged = sal_True; - } - } - else - delete pPrt, pPrt = 0; - } - - if( !pPrt ) - { - //Das ItemSet wird vom Sfx geloescht! - SfxItemSet *pSet = new SfxItemSet( GetAttrPool(), - FN_PARAM_ADDPRINTER, FN_PARAM_ADDPRINTER, - SID_HTML_MODE, SID_HTML_MODE, - SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN, - SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC, - 0 ); - SfxPrinter *p = new SfxPrinter( pSet, rJobSetup ); - if ( bCheckPageDescs ) - setPrinter( p, true, true ); - else - { - pPrt = p; - bDataChanged = sal_True; - } - } - if ( bDataChanged && !get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE) ) - PrtDataChanged(); -} - -const SwPrintData & SwDoc::getPrintData() const -{ - if(!pPrtData) - { - SwDoc * pThis = const_cast< SwDoc * >(this); - pThis->pPrtData = new SwPrintData; - - // SwPrintData should be initialized from the configuration, - // the respective config item is implememted by SwPrintOptions which - // is also derived from SwPrintData - const SwDocShell *pDocSh = GetDocShell(); - OSL_ENSURE( pDocSh, "pDocSh is 0, can't determine if this is a WebDoc or not" ); - bool bWeb = 0 != dynamic_cast< const SwWebDocShell * >(pDocSh); - SwPrintOptions aPrintOptions( bWeb ); - *pThis->pPrtData = aPrintOptions; - } - return *pPrtData; -} - -void SwDoc::setPrintData(/*[in]*/ const SwPrintData& rPrtData ) -{ - if(!pPrtData) - pPrtData = new SwPrintData; - *pPrtData = rPrtData; -} - -/* Implementations the next Interface here */ - -/* - * Dokumenteditieren (Doc-SS) zum Fuellen des Dokuments - * durch den RTF Parser und fuer die EditShell. - */ -void SwDoc::ChgDBData(const SwDBData& rNewData) -{ - if( rNewData != aDBData ) - { - aDBData = rNewData; - SetModified(); - } - GetSysFldType(RES_DBNAMEFLD)->UpdateFlds(); -} - -bool SwDoc::SplitNode( const SwPosition &rPos, bool bChkTableStart ) -{ - SwCntntNode *pNode = rPos.nNode.GetNode().GetCntntNode(); - if(0 == pNode) - return false; - - { - // BUG 26675: DataChanged vorm loeschen verschicken, dann bekommt - // man noch mit, welche Objecte sich im Bereich befinden. - // Danach koennen sie vor/hinter der Position befinden. - SwDataChanged aTmp( this, rPos, 0 ); - } - - SwUndoSplitNode* pUndo = 0; - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().ClearRedo(); - // einfuegen vom Undo-Object, z.Z. nur beim TextNode - if( pNode->IsTxtNode() ) - { - pUndo = new SwUndoSplitNode( this, rPos, bChkTableStart ); - GetIDocumentUndoRedo().AppendUndo(pUndo); - } - } - - //JP 28.01.97: Sonderfall fuer SplitNode am Tabellenanfang: - // steht die am Doc/Fly/Footer/..-Anfang oder direkt - // hinter einer Tabelle, dann fuege davor - // einen Absatz ein - if( bChkTableStart && !rPos.nContent.GetIndex() && pNode->IsTxtNode() ) - { - sal_uLong nPrevPos = rPos.nNode.GetIndex() - 1; - const SwTableNode* pTblNd; - const SwNode* pNd = GetNodes()[ nPrevPos ]; - if( pNd->IsStartNode() && - SwTableBoxStartNode == ((SwStartNode*)pNd)->GetStartNodeType() && - 0 != ( pTblNd = GetNodes()[ --nPrevPos ]->GetTableNode() ) && - ((( pNd = GetNodes()[ --nPrevPos ])->IsStartNode() && - SwTableBoxStartNode != ((SwStartNode*)pNd)->GetStartNodeType() ) - || ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsTableNode() ) - || pNd->IsCntntNode() )) - { - if( pNd->IsCntntNode() ) - { - //JP 30.04.99 Bug 65660: - // ausserhalb des normalen BodyBereiches gibt es keine - // Seitenumbrueche, also ist das hier kein gueltige - // Bedingung fuers einfuegen eines Absatzes - if( nPrevPos < GetNodes().GetEndOfExtras().GetIndex() ) - pNd = 0; - else - { - // Dann nur, wenn die Tabelle Umbrueche traegt! - const SwFrmFmt* pFrmFmt = pTblNd->GetTable().GetFrmFmt(); - if( SFX_ITEM_SET != pFrmFmt->GetItemState(RES_PAGEDESC, sal_False) && - SFX_ITEM_SET != pFrmFmt->GetItemState( RES_BREAK, sal_False ) ) - pNd = 0; - } - } - - if( pNd ) - { - SwTxtNode* pTxtNd = GetNodes().MakeTxtNode( - SwNodeIndex( *pTblNd ), - GetTxtCollFromPool( RES_POOLCOLL_TEXT )); - if( pTxtNd ) - { - ((SwPosition&)rPos).nNode = pTblNd->GetIndex()-1; - ((SwPosition&)rPos).nContent.Assign( pTxtNd, 0 ); - - // nur im BodyBereich den SeitenUmbruch/-Vorlage umhaengem - if( nPrevPos > GetNodes().GetEndOfExtras().GetIndex() ) - { - SwFrmFmt* pFrmFmt = pTblNd->GetTable().GetFrmFmt(); - const SfxPoolItem *pItem; - if( SFX_ITEM_SET == pFrmFmt->GetItemState( RES_PAGEDESC, - sal_False, &pItem ) ) - { - pTxtNd->SetAttr( *pItem ); - pFrmFmt->ResetFmtAttr( RES_PAGEDESC ); - } - if( SFX_ITEM_SET == pFrmFmt->GetItemState( RES_BREAK, - sal_False, &pItem ) ) - { - pTxtNd->SetAttr( *pItem ); - pFrmFmt->ResetFmtAttr( RES_BREAK ); - } - } - - if( pUndo ) - pUndo->SetTblFlag(); - SetModified(); - return true; - } - } - } - } - - std::vector<sal_uLong> aBkmkArr; - _SaveCntntIdx( this, rPos.nNode.GetIndex(), rPos.nContent.GetIndex(), - aBkmkArr, SAVEFLY_SPLIT ); - // FIXME: only SwTxtNode has a valid implementation of SplitCntntNode! - OSL_ENSURE(pNode->IsTxtNode(), "splitting non-text node?"); - pNode = pNode->SplitCntntNode( rPos ); - if (pNode) - { - // verschiebe noch alle Bookmarks/TOXMarks/FlyAtCnt - if( !aBkmkArr.empty() ) - _RestoreCntntIdx( this, aBkmkArr, rPos.nNode.GetIndex()-1, 0, sal_True ); - - if( IsRedlineOn() || (!IsIgnoreRedline() && pRedlineTbl->Count() )) - { - SwPaM aPam( rPos ); - aPam.SetMark(); - aPam.Move( fnMoveBackward ); - if( IsRedlineOn() ) - AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); - else - SplitRedline( aPam ); - } - } - - SetModified(); - return true; -} - -bool SwDoc::AppendTxtNode( SwPosition& rPos ) -{ - // create new node before EndOfContent - SwTxtNode * pCurNode = rPos.nNode.GetNode().GetTxtNode(); - if( !pCurNode ) - { - // dann kann ja einer angelegt werden! - SwNodeIndex aIdx( rPos.nNode, 1 ); - pCurNode = GetNodes().MakeTxtNode( aIdx, - GetTxtCollFromPool( RES_POOLCOLL_STANDARD )); - } - else - pCurNode = (SwTxtNode*)pCurNode->AppendNode( rPos ); - - rPos.nNode++; - rPos.nContent.Assign( pCurNode, 0 ); - - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().AppendUndo( new SwUndoInsert( rPos.nNode ) ); - } - - if( IsRedlineOn() || (!IsIgnoreRedline() && pRedlineTbl->Count() )) - { - SwPaM aPam( rPos ); - aPam.SetMark(); - aPam.Move( fnMoveBackward ); - if( IsRedlineOn() ) - AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); - else - SplitRedline( aPam ); - } - - SetModified(); - return sal_True; -} - -bool SwDoc::InsertString( const SwPaM &rRg, const String &rStr, - const enum InsertFlags nInsertMode ) -{ - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().ClearRedo(); // AppendUndo not always called! - } - - const SwPosition& rPos = *rRg.GetPoint(); - - if( pACEWord ) // Aufnahme in die Autokorrektur - { - if( 1 == rStr.Len() && pACEWord->IsDeleted() ) - { - pACEWord->CheckChar( rPos, rStr.GetChar( 0 ) ); - } - delete pACEWord, pACEWord = 0; - } - - SwTxtNode *const pNode = rPos.nNode.GetNode().GetTxtNode(); - if(!pNode) - { - return false; - } - - SwDataChanged aTmp( rRg, 0 ); - - if (!GetIDocumentUndoRedo().DoesUndo() || - !GetIDocumentUndoRedo().DoesGroupUndo()) - { - pNode->InsertText( rStr, rPos.nContent, nInsertMode ); - - if (GetIDocumentUndoRedo().DoesUndo()) - { - SwUndoInsert * const pUndo( new SwUndoInsert( - rPos.nNode, rPos.nContent.GetIndex(), rStr.Len(), nInsertMode)); - GetIDocumentUndoRedo().AppendUndo(pUndo); - } - } - else - { // ist Undo und Gruppierung eingeschaltet, ist alles anders ! - SwUndoInsert * pUndo = NULL; - - // don't group the start if hints at the start should be expanded - if (!(nInsertMode & IDocumentContentOperations::INS_FORCEHINTEXPAND)) - { - SwUndo *const pLastUndo = GetUndoManager().GetLastUndo(); - SwUndoInsert *const pUndoInsert( - dynamic_cast<SwUndoInsert *>(pLastUndo) ); - if (pUndoInsert && pUndoInsert->CanGrouping(rPos)) - { - pUndo = pUndoInsert; - } - } - - CharClass const& rCC = GetAppCharClass(); - xub_StrLen nInsPos = rPos.nContent.GetIndex(); - - if (!pUndo) - { - pUndo = new SwUndoInsert( rPos.nNode, nInsPos, 0, nInsertMode, - !rCC.isLetterNumeric( rStr, 0 ) ); - GetIDocumentUndoRedo().AppendUndo( pUndo ); - } - - pNode->InsertText( rStr, rPos.nContent, nInsertMode ); - - for( xub_StrLen i = 0; i < rStr.Len(); ++i ) - { - nInsPos++; - // wenn CanGrouping() sal_True returnt, ist schon alles erledigt - if( !pUndo->CanGrouping( rStr.GetChar( i ) )) - { - pUndo = new SwUndoInsert( rPos.nNode, nInsPos, 1, nInsertMode, - !rCC.isLetterNumeric( rStr, i ) ); - GetIDocumentUndoRedo().AppendUndo( pUndo ); - } - } - } - - if( IsRedlineOn() || (!IsIgnoreRedline() && pRedlineTbl->Count() )) - { - SwPaM aPam( rPos.nNode, aTmp.GetCntnt(), - rPos.nNode, rPos.nContent.GetIndex()); - if( IsRedlineOn() ) - { - AppendRedline( - new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true); - } - else - { - SplitRedline( aPam ); - } - } - - SetModified(); - return true; -} - -SwFlyFrmFmt* SwDoc::_InsNoTxtNode( const SwPosition& rPos, SwNoTxtNode* pNode, - const SfxItemSet* pFlyAttrSet, - const SfxItemSet* pGrfAttrSet, - SwFrmFmt* pFrmFmt) -{ - SwFlyFrmFmt *pFmt = 0; - if( pNode ) - { - pFmt = _MakeFlySection( rPos, *pNode, FLY_AT_PARA, - pFlyAttrSet, pFrmFmt ); - if( pGrfAttrSet ) - pNode->SetAttr( *pGrfAttrSet ); - } - return pFmt; -} - -SwFlyFrmFmt* SwDoc::Insert( const SwPaM &rRg, - const String& rGrfName, - const String& rFltName, - const Graphic* pGraphic, - const SfxItemSet* pFlyAttrSet, - const SfxItemSet* pGrfAttrSet, - SwFrmFmt* pFrmFmt ) -{ - if( !pFrmFmt ) - pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_GRAPHIC ); - return _InsNoTxtNode( *rRg.GetPoint(), GetNodes().MakeGrfNode( - SwNodeIndex( GetNodes().GetEndOfAutotext() ), - rGrfName, rFltName, pGraphic, - pDfltGrfFmtColl ), - pFlyAttrSet, pGrfAttrSet, pFrmFmt ); -} - -SwFlyFrmFmt* SwDoc::Insert( const SwPaM &rRg, const GraphicObject& rGrfObj, - const SfxItemSet* pFlyAttrSet, - const SfxItemSet* pGrfAttrSet, - SwFrmFmt* pFrmFmt ) -{ - if( !pFrmFmt ) - pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_GRAPHIC ); - return _InsNoTxtNode( *rRg.GetPoint(), GetNodes().MakeGrfNode( - SwNodeIndex( GetNodes().GetEndOfAutotext() ), - rGrfObj, pDfltGrfFmtColl ), - pFlyAttrSet, pGrfAttrSet, pFrmFmt ); -} - -SwFlyFrmFmt* SwDoc::Insert(const SwPaM &rRg, const svt::EmbeddedObjectRef& xObj, - const SfxItemSet* pFlyAttrSet, - const SfxItemSet* pGrfAttrSet, - SwFrmFmt* pFrmFmt ) -{ - if( !pFrmFmt ) - { - sal_uInt16 nId = RES_POOLFRM_OLE; - SvGlobalName aClassName( xObj->getClassID() ); - if (SotExchange::IsMath(aClassName)) - nId = RES_POOLFRM_FORMEL; - - pFrmFmt = GetFrmFmtFromPool( nId ); - } - return _InsNoTxtNode( *rRg.GetPoint(), GetNodes().MakeOLENode( - SwNodeIndex( GetNodes().GetEndOfAutotext() ), - xObj, - pDfltGrfFmtColl ), - pFlyAttrSet, pGrfAttrSet, - pFrmFmt ); -} - -SwFlyFrmFmt* SwDoc::InsertOLE(const SwPaM &rRg, const String& rObjName, - sal_Int64 nAspect, - const SfxItemSet* pFlyAttrSet, - const SfxItemSet* pGrfAttrSet, - SwFrmFmt* pFrmFmt ) -{ - if( !pFrmFmt ) - pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_OLE ); - - return _InsNoTxtNode( *rRg.GetPoint(), - GetNodes().MakeOLENode( - SwNodeIndex( GetNodes().GetEndOfAutotext() ), - rObjName, - nAspect, - pDfltGrfFmtColl, - 0 ), - pFlyAttrSet, pGrfAttrSet, - pFrmFmt ); -} - -/************************************************************************* -|* SwDoc::GetFldType() -|* Beschreibung: liefert den am Doc eingerichteten Feldtypen zurueck -*************************************************************************/ -SwFieldType *SwDoc::GetSysFldType( const sal_uInt16 eWhich ) const -{ - for( sal_uInt16 i = 0; i < INIT_FLDTYPES; ++i ) - if( eWhich == (*pFldTypes)[i]->Which() ) - return (*pFldTypes)[i]; - return 0; -} - -/************************************************************************* - * void SetDocStat( const SwDocStat& rStat ); - *************************************************************************/ -void SwDoc::SetDocStat( const SwDocStat& rStat ) -{ - *pDocStat = rStat; -} - -const SwDocStat& SwDoc::GetDocStat() const -{ - return *pDocStat; -} - -struct _PostItFld : public _SetGetExpFld -{ - _PostItFld( const SwNodeIndex& rNdIdx, const SwTxtFld* pFld, const SwIndex* pIdx = 0 ) - : _SetGetExpFld( rNdIdx, pFld, pIdx ) {} - - sal_uInt16 GetPageNo( const StringRangeEnumerator &rRangeEnum, - const std::set< sal_Int32 > &rPossiblePages, - sal_uInt16& rVirtPgNo, sal_uInt16& rLineNo ); - - SwPostItField* GetPostIt() const - { - return (SwPostItField*) GetFld()->GetFld().GetFld(); - } -}; - -sal_uInt16 _PostItFld::GetPageNo( - const StringRangeEnumerator &rRangeEnum, - const std::set< sal_Int32 > &rPossiblePages, - /* out */ sal_uInt16& rVirtPgNo, /* out */ sal_uInt16& rLineNo ) -{ - //Problem: Wenn ein PostItFld in einem Node steht, der von mehr als - //einer Layout-Instanz repraesentiert wird, steht die Frage im Raum, - //ob das PostIt nur ein- oder n-mal gedruck werden soll. - //Wahrscheinlich nur einmal, als Seitennummer soll hier keine Zufaellige - //sondern die des ersten Auftretens des PostIts innerhalb des selektierten - //Bereichs ermittelt werden. - rVirtPgNo = 0; - sal_uInt16 nPos = GetCntnt(); - SwIterator<SwTxtFrm,SwTxtNode> aIter( GetFld()->GetTxtNode() ); - for( SwTxtFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) - { - if( pFrm->GetOfst() > nPos || - (pFrm->HasFollow() && pFrm->GetFollow()->GetOfst() <= nPos) ) - continue; - sal_uInt16 nPgNo = pFrm->GetPhyPageNum(); - if( rRangeEnum.hasValue( nPgNo, &rPossiblePages )) - { - rLineNo = (sal_uInt16)(pFrm->GetLineCount( nPos ) + - pFrm->GetAllLines() - pFrm->GetThisLines()); - rVirtPgNo = pFrm->GetVirtPageNum(); - return nPgNo; - } - } - return 0; -} - -bool lcl_GetPostIts( - IDocumentFieldsAccess* pIDFA, - _SetGetExpFlds * pSrtLst ) -{ - bool bHasPostIts = false; - - SwFieldType* pFldType = pIDFA->GetSysFldType( RES_POSTITFLD ); - OSL_ENSURE( pFldType, "kein PostItType ? "); - - if( pFldType->GetDepends() ) - { - // Modify-Object gefunden, trage alle Felder ins Array ein - SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType ); - const SwTxtFld* pTxtFld; - for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() ) - { - if( 0 != ( pTxtFld = pFld->GetTxtFld() ) && - pTxtFld->GetTxtNode().GetNodes().IsDocNodes() ) - { - bHasPostIts = true; - if (pSrtLst) - { - SwNodeIndex aIdx( pTxtFld->GetTxtNode() ); - _PostItFld* pNew = new _PostItFld( aIdx, pTxtFld ); - pSrtLst->Insert( pNew ); - } - else - break; // we just wanted to check for the existence of postits ... - } - } - } - - return bHasPostIts; -} - -static void lcl_FormatPostIt( - IDocumentContentOperations* pIDCO, - SwPaM& aPam, - SwPostItField* pField, - bool bNewPage, bool bIsFirstPostIt, - sal_uInt16 nPageNo, sal_uInt16 nLineNo ) -{ - static char const sTmp[] = " : "; - - OSL_ENSURE( ViewShell::GetShellRes(), "missing ShellRes" ); - - if (bNewPage) - { - pIDCO->InsertPoolItem( aPam, SvxFmtBreakItem( SVX_BREAK_PAGE_AFTER, RES_BREAK ), 0 ); - pIDCO->SplitNode( *aPam.GetPoint(), false ); - } - else if (!bIsFirstPostIt) - { - // add an empty line between different notes - pIDCO->SplitNode( *aPam.GetPoint(), false ); - pIDCO->SplitNode( *aPam.GetPoint(), false ); - } - - String aStr( ViewShell::GetShellRes()->aPostItPage ); - aStr.AppendAscii(sTmp); - - aStr += XubString::CreateFromInt32( nPageNo ); - aStr += ' '; - if( nLineNo ) - { - aStr += ViewShell::GetShellRes()->aPostItLine; - aStr.AppendAscii(sTmp); - aStr += XubString::CreateFromInt32( nLineNo ); - aStr += ' '; - } - aStr += ViewShell::GetShellRes()->aPostItAuthor; - aStr.AppendAscii(sTmp); - aStr += pField->GetPar1(); - aStr += ' '; - SvtSysLocale aSysLocale; - aStr += /*(LocaleDataWrapper&)*/aSysLocale.GetLocaleData().getDate( pField->GetDate() ); - pIDCO->InsertString( aPam, aStr ); - - pIDCO->SplitNode( *aPam.GetPoint(), false ); - aStr = pField->GetPar2(); -#if defined( WNT ) - // Bei Windows und Co alle CR rausschmeissen - aStr.EraseAllChars( '\r' ); -#endif - pIDCO->InsertString( aPam, aStr ); -} - -// provide the paper tray to use according to the page style in use, -// but do that only if the respective item is NOT just the default item -static sal_Int32 lcl_GetPaperBin( const SwPageFrm *pStartFrm ) -{ - sal_Int32 nRes = -1; - - const SwFrmFmt &rFmt = pStartFrm->GetPageDesc()->GetMaster(); - const SfxPoolItem *pItem = NULL; - SfxItemState eState = rFmt.GetItemState( RES_PAPER_BIN, sal_False, &pItem ); - const SvxPaperBinItem *pPaperBinItem = dynamic_cast< const SvxPaperBinItem * >(pItem); - if (eState > SFX_ITEM_DEFAULT && pPaperBinItem) - nRes = pPaperBinItem->GetValue(); - - return nRes; -} - -void SwDoc::CalculatePagesForPrinting( - const SwRootFrm& rLayout, - /* out */ SwRenderData &rData, - const SwPrintUIOptions &rOptions, - bool bIsPDFExport, - sal_Int32 nDocPageCount ) -{ - const sal_Int32 nContent = rOptions.getIntValue( "PrintContent", 0 ); - const bool bPrintSelection = nContent == 2; - - // properties to take into account when calcualting the set of pages - // (PDF export UI does not allow for selecting left or right pages only) - bool bPrintLeftPages = bIsPDFExport ? true : rOptions.IsPrintLeftPages(); - bool bPrintRightPages = bIsPDFExport ? true : rOptions.IsPrintRightPages(); - // #i103700# printing selections should not allow for automatic inserting empty pages - bool bPrintEmptyPages = bPrintSelection ? false : rOptions.IsPrintEmptyPages( bIsPDFExport ); - - Range aPages( 1, nDocPageCount ); - - MultiSelection aMulti( aPages ); - aMulti.SetTotalRange( Range( 0, RANGE_MAX ) ); - aMulti.Select( aPages ); - - const SwPageFrm *pStPage = dynamic_cast<const SwPageFrm*>( rLayout.Lower() ); - const SwFrm *pEndPage = pStPage; - - sal_uInt16 nFirstPageNo = 0; - sal_uInt16 nLastPageNo = 0; - - for( sal_uInt16 i = 1; i <= (sal_uInt16)aPages.Max(); ++i ) - { - if( i < (sal_uInt16)aPages.Min() ) - { - if( !pStPage->GetNext() ) - break; - pStPage = (SwPageFrm*)pStPage->GetNext(); - pEndPage= pStPage; - } - else if( i == (sal_uInt16)aPages.Min() ) - { - nFirstPageNo = i; - nLastPageNo = nFirstPageNo; - if( !pStPage->GetNext() || (i == (sal_uInt16)aPages.Max()) ) - break; - pEndPage = pStPage->GetNext(); - } - else if( i > (sal_uInt16)aPages.Min() ) - { - nLastPageNo = i; - if( !pEndPage->GetNext() || (i == (sal_uInt16)aPages.Max()) ) - break; - pEndPage = pEndPage->GetNext(); - } - } - - OSL_ENSURE( nFirstPageNo, "first page not found! Should not happen!" ); - if (nFirstPageNo) - { -// HACK: Hier muss von der MultiSelection noch eine akzeptable Moeglichkeit -// geschaffen werden, alle Seiten von Seite x an zu deselektieren. -// Z.B. durch SetTotalRange .... - -// aMulti.Select( Range( nLastPageNo+1, SELECTION_MAX ), sal_False ); - MultiSelection aTmpMulti( Range( 1, nLastPageNo ) ); - long nTmpIdx = aMulti.FirstSelected(); - static long nEndOfSelection = SFX_ENDOFSELECTION; - while ( nEndOfSelection != nTmpIdx && nTmpIdx <= long(nLastPageNo) ) - { - aTmpMulti.Select( nTmpIdx ); - nTmpIdx = aMulti.NextSelected(); - } - aMulti = aTmpMulti; -// Ende des HACKs - - sal_uInt16 nPageNo = nFirstPageNo; - - std::map< sal_Int32, sal_Int32 > &rPrinterPaperTrays = rData.GetPrinterPaperTrays(); - std::set< sal_Int32 > &rValidPages = rData.GetValidPagesSet(); - std::map< sal_Int32, const SwPageFrm * > &rValidStartFrms = rData.GetValidStartFrames(); - rValidPages.clear(); - rValidStartFrms.clear(); - while ( pStPage ) - { - const sal_Bool bRightPg = pStPage->OnRightPage(); - if ( aMulti.IsSelected( nPageNo ) && - ( (bRightPg && bPrintRightPages) || - (!bRightPg && bPrintLeftPages) ) ) - { - // Feature - Print empty pages - if ( bPrintEmptyPages || pStPage->Frm().Height() ) - { - rValidPages.insert( nPageNo ); - rValidStartFrms[ nPageNo ] = pStPage; - - rPrinterPaperTrays[ nPageNo ] = lcl_GetPaperBin( pStPage ); - } - } - - if ( pStPage == pEndPage ) - { - pStPage = 0; - } - else - { ++nPageNo; - pStPage = (SwPageFrm*)pStPage->GetNext(); - } - } - } - - - // - // now that we have identified the valid pages for printing according - // to the print settings we need to get the PageRange to use and - // use both results to get the actual pages to be printed - // (post-it settings need to be taken into account later on!) - // - - // get PageRange value to use - OUString aPageRange; - // #i116085# - adjusting fix for i113919 - if ( !bIsPDFExport ) - { - // PageContent : - // 0 -> print all pages (default if aPageRange is empty) - // 1 -> print range according to PageRange - // 2 -> print selection - if (1 == nContent) - aPageRange = rOptions.getStringValue( "PageRange", OUString() ); - if (2 == nContent) - { - // note that printing selections is actually implemented by copying - // the selection to a new temporary document and printing all of that one. - // Thus for Writer "PrintContent" must never be 2. - // See SwXTextDocument::GetRenderDoc for evaluating if a selection is to be - // printed and for creating the temporary document. - } - - // please note - } - if (aPageRange.getLength() == 0) // empty string -> print all - { - // set page range to print to 'all pages' - aPageRange = OUString::valueOf( (sal_Int32)1 ); - aPageRange += OUString::valueOf( (sal_Unicode)'-'); - aPageRange += OUString::valueOf( nDocPageCount ); - } - rData.SetPageRange( aPageRange ); - - // get vector of pages to print according to PageRange and valid pages set from above - // (result may be an empty vector, for example if the range string is not correct) - StringRangeEnumerator::getRangesFromString( - aPageRange, rData.GetPagesToPrint(), - 1, nDocPageCount, 0, &rData.GetValidPagesSet() ); -} - -void SwDoc::UpdatePagesForPrintingWithPostItData( - /* out */ SwRenderData &rData, - const SwPrintUIOptions &rOptions, - bool /*bIsPDFExport*/, - sal_Int32 nDocPageCount ) -{ - - sal_Int16 nPostItMode = (sal_Int16) rOptions.getIntValue( "PrintAnnotationMode", 0 ); - OSL_ENSURE(nPostItMode == POSTITS_NONE || rData.HasPostItData(), - "print post-its without post-it data?" ); - const sal_uInt16 nPostItCount = rData.HasPostItData() ? rData.m_pPostItFields->Count() : 0; - if (nPostItMode != POSTITS_NONE && nPostItCount > 0) - { - SET_CURR_SHELL( rData.m_pPostItShell ); - - // clear document and move to end of it - SwPaM aPam( rData.m_pPostItDoc->GetNodes().GetEndOfContent() ); - aPam.Move( fnMoveBackward, fnGoDoc ); - aPam.SetMark(); - aPam.Move( fnMoveForward, fnGoDoc ); - rData.m_pPostItDoc->DeleteRange( aPam ); - - const StringRangeEnumerator aRangeEnum( rData.GetPageRange(), 1, nDocPageCount, 0 ); - - // For mode POSTITS_ENDPAGE: - // maps a physical page number to the page number in post-it document that holds - // the first post-it for that physical page . Needed to relate the correct start frames - // from the post-it doc to the physical page of the document - std::map< sal_Int32, sal_Int32 > aPostItLastStartPageNum; - - // add all post-its on valid pages within the the page range to the - // temporary post-it document. - // Since the array of post-it fileds is sorted by page and line number we will - // already get them in the correct order - sal_uInt16 nVirtPg = 0, nLineNo = 0, nLastPageNum = 0, nPhyPageNum = 0; - bool bIsFirstPostIt = true; - for (sal_uInt16 i = 0; i < nPostItCount; ++i) - { - _PostItFld& rPostIt = (_PostItFld&)*(*rData.m_pPostItFields)[ i ]; - nLastPageNum = nPhyPageNum; - nPhyPageNum = rPostIt.GetPageNo( - aRangeEnum, rData.GetValidPagesSet(), nVirtPg, nLineNo ); - if (nPhyPageNum) - { - // need to insert a page break? - // In POSTITS_ENDPAGE mode for each document page the following - // post-it page needs to start on a new page - const bool bNewPage = nPostItMode == POSTITS_ENDPAGE && - !bIsFirstPostIt && nPhyPageNum != nLastPageNum; - - lcl_FormatPostIt( rData.m_pPostItShell->GetDoc(), aPam, - rPostIt.GetPostIt(), bNewPage, bIsFirstPostIt, nVirtPg, nLineNo ); - bIsFirstPostIt = false; - - if (nPostItMode == POSTITS_ENDPAGE) - { - // get the correct number of current pages for the post-it document - rData.m_pPostItShell->CalcLayout(); - const sal_Int32 nPages = rData.m_pPostItShell->GetPageCount(); - aPostItLastStartPageNum[ nPhyPageNum ] = nPages; - } - } - } - - // format post-it doc to get correct number of pages - rData.m_pPostItShell->CalcLayout(); - const sal_Int32 nPostItDocPageCount = rData.m_pPostItShell->GetPageCount(); - - if (nPostItMode == POSTITS_ONLY || nPostItMode == POSTITS_ENDDOC) - { - // now add those post-it pages to the vector of pages to print - // or replace them if only post-its should be printed - - rData.GetPostItStartFrames().clear(); - if (nPostItMode == POSTITS_ENDDOC) - { - // set all values up to number of pages to print currently known to NULL, - // meaning none of the pages currently in the vector is from the - // post-it document, they are the documents pages. - rData.GetPostItStartFrames().resize( rData.GetPagesToPrint().size() ); - } - else if (nPostItMode == POSTITS_ONLY) - { - // no document page to be printed - rData.GetPagesToPrint().clear(); - } - - // now we just need to add the post-it pages to be printed to the end - // of the vector of pages to print and keep the GetValidStartFrames - // data conform with it - sal_Int32 nPageNum = 0; - const SwPageFrm * pPageFrm = (SwPageFrm*)rData.m_pPostItShell->GetLayout()->Lower(); - while( pPageFrm && nPageNum < nPostItDocPageCount ) - { - OSL_ENSURE( pPageFrm, "Empty page frame. How are we going to print this?" ); - ++nPageNum; - rData.GetPagesToPrint().push_back( 0 ); // a page number of 0 indicates this page is from the post-it doc - OSL_ENSURE( pPageFrm, "pPageFrm is NULL!" ); - rData.GetPostItStartFrames().push_back( pPageFrm ); - pPageFrm = (SwPageFrm*)pPageFrm->GetNext(); - } - OSL_ENSURE( nPageNum == nPostItDocPageCount, "unexpected number of pages" ); - } - else if (nPostItMode == POSTITS_ENDPAGE) - { - // the next step is to find all the start frames from the post-it - // document that should be printed for a given physical page of the document - std::map< sal_Int32, std::vector< const SwPageFrm * > > aPhysPageToPostItFrames; - - // ... thus, first collect all post-it doc start frames in a vector - sal_Int32 nPostItPageNum = 0; - std::vector< const SwPageFrm * > aAllPostItStartFrames; - const SwPageFrm * pPageFrm = (SwPageFrm*)rData.m_pPostItShell->GetLayout()->Lower(); - while( pPageFrm && sal_Int32(aAllPostItStartFrames.size()) < nPostItDocPageCount ) - { - OSL_ENSURE( pPageFrm, "Empty page frame. How are we going to print this?" ); - ++nPostItPageNum; - aAllPostItStartFrames.push_back( pPageFrm ); - pPageFrm = (SwPageFrm*)pPageFrm->GetNext(); - } - OSL_ENSURE( sal_Int32(aAllPostItStartFrames.size()) == nPostItDocPageCount, - "unexpected number of frames; does not match number of pages" ); - - // get a map that holds all post-it frames to be printed for a - // given physical page from the document - sal_Int32 nLastStartPageNum = 0; - std::map< sal_Int32, sal_Int32 >::const_iterator aIt; - for (aIt = aPostItLastStartPageNum.begin(); aIt != aPostItLastStartPageNum.end(); ++aIt) - { - const sal_Int32 nFrames = aIt->second - nLastStartPageNum; - const sal_Int32 nFirstStartPageNum = aIt == aPostItLastStartPageNum.begin() ? - 1 : aIt->second - nFrames + 1; - OSL_ENSURE( 1 <= nFirstStartPageNum && nFirstStartPageNum <= nPostItDocPageCount, - "page number for first frame out of range" ); - std::vector< const SwPageFrm * > aStartFrames; - for (sal_Int32 i = 0; i < nFrames; ++i) - { - const sal_Int32 nIdx = nFirstStartPageNum - 1 + i; // -1 because lowest page num is 1 - OSL_ENSURE( 0 <= nIdx && nIdx < sal_Int32(aAllPostItStartFrames.size()), - "index out of range" ); - aStartFrames.push_back( aAllPostItStartFrames[ nIdx ] ); - } - aPhysPageToPostItFrames[ aIt->first /* phys page num */ ] = aStartFrames; - nLastStartPageNum = aIt->second; - } - - - // ok, now that aPhysPageToPostItFrames can give the start frames for all - // post-it pages to be printed we need to merge those at the correct - // position into the GetPagesToPrint vector and build and maintain the - // GetValidStartFrames vector as well. - // Since inserting a larger number of entries in the middle of a vector - // isn't that efficient we will create new vectors by copying the required data - std::vector< sal_Int32 > aTmpPagesToPrint; - std::vector< const SwPageFrm * > aTmpPostItStartFrames; - const size_t nNum = rData.GetPagesToPrint().size(); - for (size_t i = 0 ; i < nNum; ++i) - { - // add the physical page to print from the document - const sal_Int32 nPhysPage = rData.GetPagesToPrint()[i]; - aTmpPagesToPrint.push_back( nPhysPage ); - aTmpPostItStartFrames.push_back( NULL ); - - // add the post-it document pages to print, i.e those - // post-it pages that have the data for the above physical page - const std::vector< const SwPageFrm * > &rPostItFrames = aPhysPageToPostItFrames[ nPhysPage ]; - const size_t nPostItFrames = rPostItFrames.size(); - for (size_t k = 0; k < nPostItFrames; ++k) - { - aTmpPagesToPrint.push_back( 0 ); - aTmpPostItStartFrames.push_back( rPostItFrames[k] ); - } - } - - // finally we need to assign those vectors to the resulting ones. - // swapping the data should be more efficient than assigning since - // we won't need the temporary vectors anymore - rData.GetPagesToPrint().swap( aTmpPagesToPrint ); - rData.GetPostItStartFrames().swap( aTmpPostItStartFrames ); - } - } -} - -void SwDoc::CalculatePagePairsForProspectPrinting( - const SwRootFrm& rLayout, - /* out */ SwRenderData &rData, - const SwPrintUIOptions &rOptions, - sal_Int32 nDocPageCount ) -{ - std::map< sal_Int32, sal_Int32 > &rPrinterPaperTrays = rData.GetPrinterPaperTrays(); - std::set< sal_Int32 > &rValidPagesSet = rData.GetValidPagesSet(); - std::map< sal_Int32, const SwPageFrm * > &rValidStartFrms = rData.GetValidStartFrames(); - std::vector< std::pair< sal_Int32, sal_Int32 > > &rPagePairs = rData.GetPagePairsForProspectPrinting(); - - rPagePairs.clear(); - rValidPagesSet.clear(); - rValidStartFrms.clear(); - - rtl::OUString aPageRange = rOptions.getStringValue( "PageRange", rtl::OUString() ); - // PageContent : - // 0 -> print all pages (default if aPageRange is empty) - // 1 -> print range according to PageRange - // 2 -> print selection - const sal_Int32 nContent = rOptions.getIntValue( "PrintContent", 0 ); - if (0 == nContent) - { - // set page range to print to 'all pages' - aPageRange = OUString::valueOf( (sal_Int32)1 ); - aPageRange += OUString::valueOf( (sal_Unicode)'-'); - aPageRange += OUString::valueOf( nDocPageCount ); - } - StringRangeEnumerator aRange( aPageRange, 1, nDocPageCount, 0 ); - - if ( aRange.size() <= 0) - return; - - const SwPageFrm *pStPage = dynamic_cast<const SwPageFrm*>( rLayout.Lower() ); - sal_Int32 i = 0; - for ( i = 1; pStPage && i < nDocPageCount; ++i ) - pStPage = (SwPageFrm*)pStPage->GetNext(); - if ( !pStPage ) // dann wars das - return; - - // currently for prospect printing all pages are valid to be printed - // thus we add them all to the respective map and set for later use - sal_Int32 nPageNum = 0; - const SwPageFrm *pPageFrm = dynamic_cast<const SwPageFrm*>( rLayout.Lower() ); - while( pPageFrm && nPageNum < nDocPageCount ) - { - OSL_ENSURE( pPageFrm, "Empty page frame. How are we going to print this?" ); - ++nPageNum; - rValidPagesSet.insert( nPageNum ); - rValidStartFrms[ nPageNum ] = pPageFrm; - pPageFrm = (SwPageFrm*)pPageFrm->GetNext(); - - rPrinterPaperTrays[ nPageNum ] = lcl_GetPaperBin( pStPage ); - } - OSL_ENSURE( nPageNum == nDocPageCount, "unexpected number of pages" ); - - // properties to take into account when calcualting the set of pages - // Note: here bPrintLeftPages and bPrintRightPages refer to the (virtual) resulting pages - // of the prospect! - bool bPrintLeftPages = rOptions.IsPrintLeftPages(); - bool bPrintRightPages = rOptions.IsPrintRightPages(); - bool bPrintProspectRTL = rOptions.getIntValue( "PrintProspectRTL", 0 ) ? true : false; - - // get pages for prospect printing according to the 'PageRange' - // (duplicates and any order allowed!) - std::vector< sal_Int32 > aPagesToPrint; - StringRangeEnumerator::getRangesFromString( - aPageRange, aPagesToPrint, 1, nDocPageCount, 0 ); - - // now fill the vector for calculating the page pairs with the start frames - // from the above obtained vector - std::vector< const SwPageFrm * > aVec; - for ( i = 0; i < sal_Int32(aPagesToPrint.size()); ++i) - { - const sal_Int32 nPage = aPagesToPrint[i]; - const SwPageFrm *pFrm = rValidStartFrms[ nPage ]; - aVec.push_back( pFrm ); - } - - // just one page is special ... - if ( 1 == aVec.size() ) - aVec.insert( aVec.begin() + 1, 0 ); // insert a second empty page - else - { - // now extend the number of pages to fit a multiple of 4 - // (4 'normal' pages are needed for a single prospect paper - // with back and front) - while( aVec.size() & 3 ) - aVec.push_back( 0 ); - } - - // dann sorge mal dafuer, das alle Seiten in der richtigen - // Reihenfolge stehen: - sal_uInt16 nSPg = 0, nEPg = aVec.size(), nStep = 1; - if ( 0 == (nEPg & 1 )) // ungerade gibt es nicht! - --nEPg; - - if ( !bPrintLeftPages ) - ++nStep; - else if ( !bPrintRightPages ) - { - ++nStep; - ++nSPg, --nEPg; - } - - // the number of 'virtual' pages to be printed - sal_Int32 nCntPage = (( nEPg - nSPg ) / ( 2 * nStep )) + 1; - - for ( sal_uInt16 nPrintCount = 0; nSPg < nEPg && - nPrintCount < nCntPage; ++nPrintCount ) - { - pStPage = aVec[ nSPg ]; - const SwPageFrm* pNxtPage = nEPg < aVec.size() ? aVec[ nEPg ] : 0; - - short nRtlOfs = bPrintProspectRTL ? 1 : 0; - if ( 0 == (( nSPg + nRtlOfs) & 1 ) ) // switch for odd number in LTR, even number in RTL - { - const SwPageFrm* pTmp = pStPage; - pStPage = pNxtPage; - pNxtPage = pTmp; - } - - sal_Int32 nFirst = -1, nSecond = -1; - for ( int nC = 0; nC < 2; ++nC ) - { - sal_Int32 nPage = -1; - if ( pStPage ) - nPage = pStPage->GetPhyPageNum(); - if (nC == 0) - nFirst = nPage; - else - nSecond = nPage; - - pStPage = pNxtPage; - } - rPagePairs.push_back( std::pair< sal_Int32, sal_Int32 >(nFirst, nSecond) ); - - nSPg = nSPg + nStep; - nEPg = nEPg - nStep; - } - OSL_ENSURE( size_t(nCntPage) == rPagePairs.size(), "size mismatch for number of page pairs" ); - - // luckily prospect printing does not make use of post-its so far, - // thus we are done here. -} - -/************************************************************************* - * void UpdateDocStat( const SwDocStat& rStat ); - *************************************************************************/ -void SwDoc::UpdateDocStat( SwDocStat& rStat ) -{ - if( rStat.bModified ) - { - rStat.Reset(); - rStat.nPara = 0; // Default ist auf 1 !! - SwNode* pNd; - - for( sal_uLong i = GetNodes().Count(); i; ) - { - switch( ( pNd = GetNodes()[ --i ])->GetNodeType() ) - { - case ND_TEXTNODE: - ((SwTxtNode*)pNd)->CountWords( rStat, 0, ((SwTxtNode*)pNd)->GetTxt().Len() ); - break; - case ND_TABLENODE: ++rStat.nTbl; break; - case ND_GRFNODE: ++rStat.nGrf; break; - case ND_OLENODE: ++rStat.nOLE; break; - case ND_SECTIONNODE: break; - } - } - - // #i93174#: notes contain paragraphs that are not nodes - { - SwFieldType * const pPostits( GetSysFldType(RES_POSTITFLD) ); - SwIterator<SwFmtFld,SwFieldType> aIter( *pPostits ); - for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) - { - if (pFmtFld->IsFldInDoc()) - { - SwPostItField const * const pField( - static_cast<SwPostItField const*>(pFmtFld->GetFld())); - rStat.nAllPara += pField->GetNumberOfParagraphs(); - } - } - } - - rStat.nPage = GetCurrentLayout() ? GetCurrentLayout()->GetPageNum() : 0; //swmod 080218 - rStat.bModified = sal_False; - SetDocStat( rStat ); - - com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aStat( rStat.nPage ? 8 : 7); - sal_Int32 n=0; - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TableCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nTbl; - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImageCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nGrf; - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ObjectCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nOLE; - if ( rStat.nPage ) - { - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PageCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nPage; - } - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParagraphCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nPara; - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WordCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nWord; - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharacterCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nChar; - aStat[n].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NonWhitespaceCharacterCount")); - aStat[n++].Value <<= (sal_Int32)rStat.nCharExcludingSpaces; - - // For e.g. autotext documents there is no pSwgInfo (#i79945) - SfxObjectShell * const pObjShell( GetDocShell() ); - if (pObjShell) - { - const uno::Reference<document::XDocumentPropertiesSupplier> xDPS( - pObjShell->GetModel(), uno::UNO_QUERY_THROW); - const uno::Reference<document::XDocumentProperties> xDocProps( - xDPS->getDocumentProperties()); - // #i96786#: do not set modified flag when updating statistics - const bool bDocWasModified( IsModified() ); - const ModifyBlocker_Impl b(pObjShell); - xDocProps->setDocumentStatistics(aStat); - if (!bDocWasModified) - { - ResetModified(); - } - } - - // event. Stat. Felder Updaten - SwFieldType *pType = GetSysFldType(RES_DOCSTATFLD); - pType->UpdateFlds(); - } -} - -// Dokument - Info -void SwDoc::DocInfoChgd( ) -{ - GetSysFldType( RES_DOCINFOFLD )->UpdateFlds(); - GetSysFldType( RES_TEMPLNAMEFLD )->UpdateFlds(); - SetModified(); -} - -// returne zum Namen die im Doc gesetzte Referenz -const SwFmtRefMark* SwDoc::GetRefMark( const String& rName ) const -{ - const SfxPoolItem* pItem; - sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_REFMARK ); - for( sal_uInt32 n = 0; n < nMaxItems; ++n ) - { - if( 0 == (pItem = GetAttrPool().GetItem2( RES_TXTATR_REFMARK, n ) )) - continue; - - const SwFmtRefMark* pFmtRef = (SwFmtRefMark*)pItem; - const SwTxtRefMark* pTxtRef = pFmtRef->GetTxtRefMark(); - if( pTxtRef && &pTxtRef->GetTxtNode().GetNodes() == &GetNodes() && - rName.Equals( pFmtRef->GetRefName() ) ) - return pFmtRef; - } - return 0; -} - -// returne die RefMark per Index - fuer Uno -const SwFmtRefMark* SwDoc::GetRefMark( sal_uInt16 nIndex ) const -{ - const SfxPoolItem* pItem; - const SwTxtRefMark* pTxtRef; - const SwFmtRefMark* pRet = 0; - - sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_REFMARK ); - sal_uInt32 nCount = 0; - for( sal_uInt32 n = 0; n < nMaxItems; ++n ) - if( 0 != (pItem = GetAttrPool().GetItem2( RES_TXTATR_REFMARK, n )) && - 0 != (pTxtRef = ((SwFmtRefMark*)pItem)->GetTxtRefMark()) && - &pTxtRef->GetTxtNode().GetNodes() == &GetNodes() ) - { - if(nCount == nIndex) - { - pRet = (SwFmtRefMark*)pItem; - break; - } - nCount++; - } - return pRet; -} - -// returne die Namen aller im Doc gesetzten Referenzen -//JP 24.06.96: Ist der ArrayPointer 0 dann returne nur, ob im Doc. eine -// RefMark gesetzt ist -// OS 25.06.96: ab jetzt wird immer die Anzahl der Referenzen returnt -sal_uInt16 SwDoc::GetRefMarks( SvStringsDtor* pNames ) const -{ - const SfxPoolItem* pItem; - const SwTxtRefMark* pTxtRef; - - sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_REFMARK ); - sal_uInt32 nCount = 0; - for( sal_uInt32 n = 0; n < nMaxItems; ++n ) - if( 0 != (pItem = GetAttrPool().GetItem2( RES_TXTATR_REFMARK, n )) && - 0 != (pTxtRef = ((SwFmtRefMark*)pItem)->GetTxtRefMark()) && - &pTxtRef->GetTxtNode().GetNodes() == &GetNodes() ) - { - if( pNames ) - { - String* pTmp = new String( ((SwFmtRefMark*)pItem)->GetRefName() ); - pNames->Insert( pTmp, nCount ); - } - nCount ++; - } - - return nCount; -} - -bool SwDoc::IsLoaded() const -{ - return mbLoaded; -} - -bool SwDoc::IsUpdateExpFld() const -{ - return mbUpdateExpFld; -} - -bool SwDoc::IsNewDoc() const -{ - return mbNewDoc; -} - -bool SwDoc::IsPageNums() const -{ - return mbPageNums; -} - -void SwDoc::SetPageNums(bool b) -{ - mbPageNums = b; -} - -void SwDoc::SetNewDoc(bool b) -{ - mbNewDoc = b; -} - -void SwDoc::SetUpdateExpFldStat(bool b) -{ - mbUpdateExpFld = b; -} - -void SwDoc::SetLoaded(bool b) -{ - mbLoaded = b; -} - -bool SwDoc::IsModified() const -{ - return mbModified; -} - -void SwDoc::SetModified() -{ - SwLayouter::ClearMovedFwdFrms( *this ); - SwLayouter::ClearObjsTmpConsiderWrapInfluence( *this ); - SwLayouter::ClearFrmsNotToWrap( *this ); - // #i65250# - SwLayouter::ClearMoveBwdLayoutInfo( *this ); - // dem Link wird der Status returnt, wie die Flags waren und werden - // Bit 0: -> alter Zustand - // Bit 1: -> neuer Zustand - long nCall = mbModified ? 3 : 2; - mbModified = sal_True; - pDocStat->bModified = sal_True; - if( aOle2Link.IsSet() ) - { - mbInCallModified = sal_True; - aOle2Link.Call( (void*)nCall ); - mbInCallModified = sal_False; - } - - if( pACEWord && !pACEWord->IsDeleted() ) - delete pACEWord, pACEWord = 0; -} - -void SwDoc::ResetModified() -{ - // dem Link wird der Status returnt, wie die Flags waren und werden - // Bit 0: -> alter Zustand - // Bit 1: -> neuer Zustand - long nCall = mbModified ? 1 : 0; - mbModified = sal_False; - // If there is already a document statistic, we assume that - // it is correct. In this case we reset the modified flag. - if ( 0 != pDocStat->nCharExcludingSpaces ) - pDocStat->bModified = sal_False; - GetIDocumentUndoRedo().SetUndoNoModifiedPosition(); - if( nCall && aOle2Link.IsSet() ) - { - mbInCallModified = sal_True; - aOle2Link.Call( (void*)nCall ); - mbInCallModified = sal_False; - } -} - -void SwDoc::ReRead( SwPaM& rPam, const String& rGrfName, - const String& rFltName, const Graphic* pGraphic, - const GraphicObject* pGrafObj ) -{ - SwGrfNode *pGrfNd; - if( ( !rPam.HasMark() - || rPam.GetPoint()->nNode.GetIndex() == rPam.GetMark()->nNode.GetIndex() ) - && 0 != ( pGrfNd = rPam.GetPoint()->nNode.GetNode().GetGrfNode() ) ) - { - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().AppendUndo(new SwUndoReRead(rPam, *pGrfNd)); - } - - // Weil nicht bekannt ist, ob sich die Grafik spiegeln laesst, - // immer das SpiegelungsAttribut zuruecksetzen - if( RES_MIRROR_GRAPH_DONT != pGrfNd->GetSwAttrSet(). - GetMirrorGrf().GetValue() ) - pGrfNd->SetAttr( SwMirrorGrf() ); - - pGrfNd->ReRead( rGrfName, rFltName, pGraphic, pGrafObj, sal_True ); - SetModified(); - } -} - -sal_Bool lcl_SpellAndGrammarAgain( const SwNodePtr& rpNd, void* pArgs ) -{ - SwTxtNode *pTxtNode = (SwTxtNode*)rpNd->GetTxtNode(); - sal_Bool bOnlyWrong = *(sal_Bool*)pArgs; - if( pTxtNode ) - { - if( bOnlyWrong ) - { - if( pTxtNode->GetWrong() && - pTxtNode->GetWrong()->InvalidateWrong() ) - pTxtNode->SetWrongDirty( true ); - if( pTxtNode->GetGrammarCheck() && - pTxtNode->GetGrammarCheck()->InvalidateWrong() ) - pTxtNode->SetGrammarCheckDirty( true ); - } - else - { - pTxtNode->SetWrongDirty( true ); - if( pTxtNode->GetWrong() ) - pTxtNode->GetWrong()->SetInvalid( 0, STRING_LEN ); - pTxtNode->SetGrammarCheckDirty( true ); - if( pTxtNode->GetGrammarCheck() ) - pTxtNode->GetGrammarCheck()->SetInvalid( 0, STRING_LEN ); - } - } - return sal_True; -} - -sal_Bool lcl_CheckSmartTagsAgain( const SwNodePtr& rpNd, void* ) -{ - SwTxtNode *pTxtNode = (SwTxtNode*)rpNd->GetTxtNode(); -// sal_Bool bOnlyWrong = *(sal_Bool*)pArgs; - if( pTxtNode ) - { - pTxtNode->SetSmartTagDirty( true ); - if( pTxtNode->GetSmartTags() ) - { -// if ( bOnlyWrong ) // only some smart tag types have been enabled or disabled -// pTxtNode->GetSmartTags()->SetInvalid( 0, STRING_LEN ); -// else // smart tags all have been enabled or disabled - pTxtNode->SetSmartTags( NULL ); - } - } - return sal_True; -} - -/************************************************************************* - * SwDoc::SpellItAgainSam( sal_Bool bInvalid, sal_Bool bOnlyWrong ) - * - * stoesst das Spelling im Idle-Handler wieder an. - * Wird bInvalid als sal_True uebergeben, so werden zusaetzlich die WrongListen - * an allen Nodes invalidiert und auf allen Seiten das SpellInvalid-Flag - * gesetzt. - * Mit bOnlyWrong kann man dann steuern, ob nur die Bereiche mit falschen - * Woertern oder die kompletten Bereiche neu ueberprueft werden muessen. - ************************************************************************/ -void SwDoc::SpellItAgainSam( sal_Bool bInvalid, sal_Bool bOnlyWrong, sal_Bool bSmartTags ) -{ - std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080307 - OSL_ENSURE( GetCurrentLayout(), "SpellAgain: Where's my RootFrm?" ); - if( bInvalid ) - { - std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::AllInvalidateSmartTagsOrSpelling),bSmartTags));//swmod 080305 - std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::SetNeedGrammarCheck), true) ); - if ( bSmartTags ) - GetNodes().ForEach( lcl_CheckSmartTagsAgain, &bOnlyWrong ); - GetNodes().ForEach( lcl_SpellAndGrammarAgain, &bOnlyWrong ); - } - - std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::SetIdleFlags));//swmod 080307 -} - -void SwDoc::InvalidateAutoCompleteFlag() -{ - SwRootFrm* pTmpRoot = GetCurrentLayout(); - if( pTmpRoot ) - { - std::set<SwRootFrm*> aAllLayouts = GetAllLayouts(); - std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllInvalidateAutoCompleteWords));//swmod 080305 - for( sal_uLong nNd = 1, nCnt = GetNodes().Count(); nNd < nCnt; ++nNd ) - { - SwTxtNode* pTxtNode = GetNodes()[ nNd ]->GetTxtNode(); - if ( pTxtNode ) pTxtNode->SetAutoCompleteWordDirty( true ); - } - - std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::SetIdleFlags));//swmod 080228 - } //swmod 080219 -} - -const SwFmtINetFmt* SwDoc::FindINetAttr( const String& rName ) const -{ - const SwFmtINetFmt* pItem; - const SwTxtINetFmt* pTxtAttr; - const SwTxtNode* pTxtNd; - sal_uInt32 n, nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_INETFMT ); - for( n = 0; n < nMaxItems; ++n ) - if( 0 != (pItem = (SwFmtINetFmt*)GetAttrPool().GetItem2( - RES_TXTATR_INETFMT, n ) ) && - pItem->GetName().Equals( rName ) && - 0 != ( pTxtAttr = pItem->GetTxtINetFmt()) && - 0 != ( pTxtNd = pTxtAttr->GetpTxtNode() ) && - &pTxtNd->GetNodes() == &GetNodes() ) - { - return pItem; - } - - return 0; -} - -void SwDoc::Summary( SwDoc* pExtDoc, sal_uInt8 nLevel, sal_uInt8 nPara, sal_Bool bImpress ) -{ - const SwOutlineNodes& rOutNds = GetNodes().GetOutLineNds(); - if( pExtDoc && rOutNds.Count() ) - { - sal_uInt16 i; - ::StartProgress( STR_STATSTR_SUMMARY, 0, rOutNds.Count(), GetDocShell() ); - SwNodeIndex aEndOfDoc( pExtDoc->GetNodes().GetEndOfContent(), -1 ); - for( i = 0; i < rOutNds.Count(); ++i ) - { - ::SetProgressState( i, GetDocShell() ); - const sal_uLong nIndex = rOutNds[ i ]->GetIndex(); - - const int nLvl = ((SwTxtNode*)GetNodes()[ nIndex ])->GetAttrOutlineLevel()-1;//<-end,zhaojianwei - if( nLvl > nLevel ) - continue; - sal_uInt16 nEndOfs = 1; - sal_uInt8 nWish = nPara; - sal_uLong nNextOutNd = i + 1 < rOutNds.Count() ? - rOutNds[ i + 1 ]->GetIndex() : GetNodes().Count(); - sal_Bool bKeep = sal_False; - while( ( nWish || bKeep ) && nIndex + nEndOfs < nNextOutNd && - GetNodes()[ nIndex + nEndOfs ]->IsTxtNode() ) - { - SwTxtNode* pTxtNode = (SwTxtNode*)GetNodes()[ nIndex+nEndOfs ]; - if( pTxtNode->GetTxt().Len() && nWish ) - --nWish; - bKeep = pTxtNode->GetSwAttrSet().GetKeep().GetValue(); - ++nEndOfs; - } - - SwNodeRange aRange( *rOutNds[ i ], 0, *rOutNds[ i ], nEndOfs ); - GetNodes()._Copy( aRange, aEndOfDoc ); - } - const SwTxtFmtColls *pColl = pExtDoc->GetTxtFmtColls(); - for( i = 0; i < pColl->Count(); ++i ) - (*pColl)[ i ]->ResetFmtAttr( RES_PAGEDESC, RES_BREAK ); - SwNodeIndex aIndx( pExtDoc->GetNodes().GetEndOfExtras() ); - ++aEndOfDoc; - while( aIndx < aEndOfDoc ) - { - SwNode *pNode; - sal_Bool bDelete = sal_False; - if( (pNode = &aIndx.GetNode())->IsTxtNode() ) - { - SwTxtNode *pNd = (SwTxtNode*)pNode; - if( pNd->HasSwAttrSet() ) - pNd->ResetAttr( RES_PAGEDESC, RES_BREAK ); - if( bImpress ) - { - SwTxtFmtColl* pMyColl = pNd->GetTxtColl(); - - const sal_uInt16 nHeadLine = static_cast<sal_uInt16>( - !pMyColl->IsAssignedToListLevelOfOutlineStyle() //<-end,zhaojianwei - ? RES_POOLCOLL_HEADLINE2 - : RES_POOLCOLL_HEADLINE1 ); - pMyColl = pExtDoc->GetTxtCollFromPool( nHeadLine ); - pNd->ChgFmtColl( pMyColl ); - } - if( !pNd->Len() && - pNd->StartOfSectionIndex()+2 < pNd->EndOfSectionIndex() ) - { - bDelete = sal_True; - pExtDoc->GetNodes().Delete( aIndx ); - } - } - if( !bDelete ) - ++aIndx; - } - ::EndProgress( GetDocShell() ); - } -} - -// loesche den nicht sichtbaren Content aus dem Document, wie z.B.: -// versteckte Bereiche, versteckte Absaetze -bool SwDoc::RemoveInvisibleContent() -{ - sal_Bool bRet = sal_False; - GetIDocumentUndoRedo().StartUndo( UNDO_UI_DELETE_INVISIBLECNTNT, NULL ); - - { - SwTxtNode* pTxtNd; - SwIterator<SwFmtFld,SwFieldType> aIter( *GetSysFldType( RES_HIDDENPARAFLD ) ); - for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() ) - { - if( pFmtFld->GetTxtFld() && - 0 != ( pTxtNd = (SwTxtNode*)pFmtFld->GetTxtFld()->GetpTxtNode() ) && - pTxtNd->GetpSwpHints() && pTxtNd->HasHiddenParaField() && - &pTxtNd->GetNodes() == &GetNodes() ) - { - bRet = sal_True; - SwPaM aPam( *pTxtNd, 0, *pTxtNd, pTxtNd->GetTxt().Len() ); - - // Remove hidden paragraph or delete contents: - // Delete contents if - // 1. removing the paragraph would result in an empty section or - // 2. if the paragraph is the last paragraph in the section and - // there is no paragraph in front of the paragraph: - if ( ( 2 == pTxtNd->EndOfSectionIndex() - pTxtNd->StartOfSectionIndex() ) || - ( 1 == pTxtNd->EndOfSectionIndex() - pTxtNd->GetIndex() && - !GetNodes()[ pTxtNd->GetIndex() - 1 ]->GetTxtNode() ) ) - { - DeleteRange( aPam ); - } - else - { - aPam.DeleteMark(); - DelFullPara( aPam ); - } - } - } - } - - // - // Remove any hidden paragraph (hidden text attribute) - // - for( sal_uLong n = GetNodes().Count(); n; ) - { - SwTxtNode* pTxtNd = GetNodes()[ --n ]->GetTxtNode(); - if ( pTxtNd ) - { - bool bRemoved = false; - SwPaM aPam( *pTxtNd, 0, *pTxtNd, pTxtNd->GetTxt().Len() ); - if ( pTxtNd->HasHiddenCharAttribute( true ) ) - { - bRemoved = sal_True; - bRet = sal_True; - - // Remove hidden paragraph or delete contents: - // Delete contents if - // 1. removing the paragraph would result in an empty section or - // 2. if the paragraph is the last paragraph in the section and - // there is no paragraph in front of the paragraph: - - if ( ( 2 == pTxtNd->EndOfSectionIndex() - pTxtNd->StartOfSectionIndex() ) || - ( 1 == pTxtNd->EndOfSectionIndex() - pTxtNd->GetIndex() && - !GetNodes()[ pTxtNd->GetIndex() - 1 ]->GetTxtNode() ) ) - { - DeleteRange( aPam ); - } - else - { - aPam.DeleteMark(); - DelFullPara( aPam ); - } - } - else if ( pTxtNd->HasHiddenCharAttribute( false ) ) - { - bRemoved = sal_True; - bRet = sal_True; - SwScriptInfo::DeleteHiddenRanges( *pTxtNd ); - } - - // Footnotes/Frames may have been removed, therefore we have - // to reset n: - if ( bRemoved ) - n = aPam.GetPoint()->nNode.GetIndex(); - } - } - - { - // dann noch alle versteckten Bereiche loeschen/leeren - SwSectionFmts aSectFmts; - SwSectionFmts& rSectFmts = GetSections(); - sal_uInt16 n; - - for( n = rSectFmts.Count(); n; ) - { - SwSectionFmt* pSectFmt = rSectFmts[ --n ]; - // don't add sections in Undo/Redo - if( !pSectFmt->IsInNodesArr()) - continue; - SwSection* pSect = pSectFmt->GetSection(); - if( pSect->CalcHiddenFlag() ) - { - SwSection* pParent = pSect, *pTmp; - while( 0 != (pTmp = pParent->GetParent() )) - { - if( pTmp->IsHiddenFlag() ) - pSect = pTmp; - pParent = pTmp; - } - - if( USHRT_MAX == aSectFmts.GetPos( pSect->GetFmt() ) ) - aSectFmts.Insert( pSect->GetFmt(), 0 ); - } - if( pSect->GetCondition().Len() ) - { - SwSectionData aSectionData( *pSect ); - aSectionData.SetCondition( aEmptyStr ); - aSectionData.SetHidden( false ); - UpdateSection( n, aSectionData ); - } - } - - if( 0 != ( n = aSectFmts.Count() )) - { - while( n ) - { - SwSectionFmt* pSectFmt = aSectFmts[ --n ]; - SwSectionNode* pSectNd = pSectFmt->GetSectionNode(); - if( pSectNd ) - { - bRet = sal_True; - SwPaM aPam( *pSectNd ); - - if( pSectNd->StartOfSectionNode()->StartOfSectionIndex() == - pSectNd->GetIndex() - 1 && - pSectNd->StartOfSectionNode()->EndOfSectionIndex() == - pSectNd->EndOfSectionIndex() + 1 ) - { - // nur den Inhalt loeschen - SwCntntNode* pCNd = GetNodes().GoNext( - &aPam.GetPoint()->nNode ); - aPam.GetPoint()->nContent.Assign( pCNd, 0 ); - aPam.SetMark(); - aPam.GetPoint()->nNode = *pSectNd->EndOfSectionNode(); - pCNd = GetNodes().GoPrevious( - &aPam.GetPoint()->nNode ); - aPam.GetPoint()->nContent.Assign( pCNd, pCNd->Len() ); - - DeleteRange( aPam ); - } - else - { - // die gesamte Section loeschen - aPam.SetMark(); - aPam.GetPoint()->nNode = *pSectNd->EndOfSectionNode(); - DelFullPara( aPam ); - } - - } - } - aSectFmts.Remove( 0, aSectFmts.Count() ); - } - } - - if( bRet ) - SetModified(); - GetIDocumentUndoRedo().EndUndo( UNDO_UI_DELETE_INVISIBLECNTNT, NULL ); - return bRet; -} -/*-- 25.08.2010 14:18:12--------------------------------------------------- - - -----------------------------------------------------------------------*/ -bool SwDoc::HasInvisibleContent() const -{ - sal_Bool bRet = sal_False; - - SwClientIter aIter( *GetSysFldType( RES_HIDDENPARAFLD ) ); - if( aIter.First( TYPE( SwFmtFld ) ) ) - bRet = sal_True; - - // - // Search for any hidden paragraph (hidden text attribute) - // - if( ! bRet ) - { - for( sal_uLong n = GetNodes().Count(); !bRet && (n > 0); ) - { - SwTxtNode* pTxtNd = GetNodes()[ --n ]->GetTxtNode(); - if ( pTxtNd ) - { - SwPaM aPam( *pTxtNd, 0, *pTxtNd, pTxtNd->GetTxt().Len() ); - if( pTxtNd->HasHiddenCharAttribute( true ) || ( pTxtNd->HasHiddenCharAttribute( false ) ) ) - { - bRet = sal_True; - } - } - } - } - - if( ! bRet ) - { - const SwSectionFmts& rSectFmts = GetSections(); - sal_uInt16 n; - - for( n = rSectFmts.Count(); !bRet && (n > 0); ) - { - SwSectionFmt* pSectFmt = rSectFmts[ --n ]; - // don't add sections in Undo/Redo - if( !pSectFmt->IsInNodesArr()) - continue; - SwSection* pSect = pSectFmt->GetSection(); - if( pSect->IsHidden() ) - bRet = sal_True; - } - } - return bRet; -} - -bool SwDoc::RestoreInvisibleContent() -{ - bool bRet = false; - SwUndoId nLastUndoId(UNDO_EMPTY); - if (GetIDocumentUndoRedo().GetLastUndoInfo(0, & nLastUndoId) - && (UNDO_UI_DELETE_INVISIBLECNTNT == nLastUndoId)) - { - GetIDocumentUndoRedo().Undo(); - GetIDocumentUndoRedo().ClearRedo(); - bRet = true; - } - return bRet; -} - - -sal_Bool SwDoc::ConvertFieldsToText() -{ - sal_Bool bRet = sal_False; - LockExpFlds(); - GetIDocumentUndoRedo().StartUndo( UNDO_UI_REPLACE, NULL ); - - const SwFldTypes* pMyFldTypes = GetFldTypes(); - sal_uInt16 nCount = pMyFldTypes->Count(); - //go backward, field types are removed - for(sal_uInt16 nType = nCount; nType > 0; --nType) - { - const SwFieldType *pCurType = pMyFldTypes->GetObject(nType - 1); - - if ( RES_POSTITFLD == pCurType->Which() ) - continue; - - SwIterator<SwFmtFld,SwFieldType> aIter( *pCurType ); - ::std::vector<const SwFmtFld*> aFieldFmts; - for( SwFmtFld* pCurFldFmt = aIter.First(); pCurFldFmt; pCurFldFmt = aIter.Next() ) - aFieldFmts.push_back(pCurFldFmt); - - ::std::vector<const SwFmtFld*>::iterator aBegin = aFieldFmts.begin(); - ::std::vector<const SwFmtFld*>::iterator aEnd = aFieldFmts.end(); - while(aBegin != aEnd) - { - const SwTxtFld *pTxtFld = (*aBegin)->GetTxtFld(); - // skip fields that are currently not in the document - // e.g. fields in undo or redo array - - sal_Bool bSkip = !pTxtFld || - !pTxtFld->GetpTxtNode()->GetNodes().IsDocNodes(); - - if (!bSkip) - { - sal_Bool bInHeaderFooter = IsInHeaderFooter(SwNodeIndex(*pTxtFld->GetpTxtNode())); - const SwFmtFld& rFmtFld = pTxtFld->GetFld(); - const SwField* pField = rFmtFld.GetFld(); - - //#i55595# some fields have to be excluded in headers/footers - sal_uInt16 nWhich = pField->GetTyp()->Which(); - if(!bInHeaderFooter || - (nWhich != RES_PAGENUMBERFLD && - nWhich != RES_CHAPTERFLD && - nWhich != RES_GETEXPFLD&& - nWhich != RES_SETEXPFLD&& - nWhich != RES_INPUTFLD&& - nWhich != RES_REFPAGEGETFLD&& - nWhich != RES_REFPAGESETFLD)) - { - String sText = pField->ExpandField(true); - //database fields should not convert their command into text - if( RES_DBFLD == pCurType->Which() && !static_cast<const SwDBField*>(pField)->IsInitialized()) - sText.Erase(); - - //now remove the field and insert the string - SwPaM aPam1(*pTxtFld->GetpTxtNode(), *pTxtFld->GetStart()); - aPam1.Move(); - //insert first to keep the field's attributes - InsertString( aPam1, sText ); - SwPaM aPam2(*pTxtFld->GetpTxtNode(), *pTxtFld->GetStart()); - aPam2.SetMark(); - aPam2.Move(); - DeleteAndJoin(aPam2);//remove the field - } - } - ++aBegin; - } - } - - if( bRet ) - SetModified(); - GetIDocumentUndoRedo().EndUndo( UNDO_UI_REPLACE, NULL ); - UnlockExpFlds(); - return bRet; - -} - -bool SwDoc::IsVisibleLinks() const -{ - return mbVisibleLinks; -} - -void SwDoc::SetVisibleLinks(bool bFlag) -{ - mbVisibleLinks = bFlag; -} - -sfx2::LinkManager& SwDoc::GetLinkManager() -{ - return *pLinkMgr; -} - -const sfx2::LinkManager& SwDoc::GetLinkManager() const -{ - return *pLinkMgr; -} - -void SwDoc::SetLinksUpdated(const bool bNewLinksUpdated) -{ - mbLinksUpdated = bNewLinksUpdated; -} - -bool SwDoc::LinksUpdated() const -{ - return mbLinksUpdated; -} - -// embedded alle lokalen Links (Bereiche/Grafiken) -::sfx2::SvBaseLink* lcl_FindNextRemovableLink( const ::sfx2::SvBaseLinks& rLinks, sfx2::LinkManager& rLnkMgr ) -{ - for( sal_uInt16 n = 0; n < rLinks.Count(); ++n ) - { - ::sfx2::SvBaseLink* pLnk = &(*rLinks[ n ]); - if( pLnk && - ( OBJECT_CLIENT_GRF == pLnk->GetObjType() || - OBJECT_CLIENT_FILE == pLnk->GetObjType() ) && - pLnk->ISA( SwBaseLink ) ) - { - ::sfx2::SvBaseLinkRef xLink = pLnk; - - String sFName; - rLnkMgr.GetDisplayNames( xLink, 0, &sFName, 0, 0 ); - - INetURLObject aURL( sFName ); - if( INET_PROT_FILE == aURL.GetProtocol() || - INET_PROT_CID == aURL.GetProtocol() ) - return pLnk; - } - } - return 0; -} -bool SwDoc::EmbedAllLinks() -{ - sal_Bool bRet = sal_False; - sfx2::LinkManager& rLnkMgr = GetLinkManager(); - const ::sfx2::SvBaseLinks& rLinks = rLnkMgr.GetLinks(); - if( rLinks.Count() ) - { - ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); - - ::sfx2::SvBaseLink* pLnk = 0; - while( 0 != (pLnk = lcl_FindNextRemovableLink( rLinks, rLnkMgr ) ) ) - { - ::sfx2::SvBaseLinkRef xLink = pLnk; - // dem Link sagen, das er aufgeloest wird! - xLink->Closed(); - - // falls einer vergessen hat sich auszutragen - if( xLink.Is() ) - rLnkMgr.Remove( xLink ); - - bRet = sal_True; - } - - GetIDocumentUndoRedo().DelAllUndoObj(); - SetModified(); - } - return bRet; -} - -sal_Bool SwDoc::IsInsTblFormatNum() const -{ - return SW_MOD()->IsInsTblFormatNum(get(IDocumentSettingAccess::HTML_MODE)); -} - -sal_Bool SwDoc::IsInsTblChangeNumFormat() const -{ - return SW_MOD()->IsInsTblChangeNumFormat(get(IDocumentSettingAccess::HTML_MODE)); -} - -sal_Bool SwDoc::IsInsTblAlignNum() const -{ - return SW_MOD()->IsInsTblAlignNum(get(IDocumentSettingAccess::HTML_MODE)); -} - -// setze das InsertDB als Tabelle Undo auf: -void SwDoc::AppendUndoForInsertFromDB( const SwPaM& rPam, sal_Bool bIsTable ) -{ - if( bIsTable ) - { - const SwTableNode* pTblNd = rPam.GetPoint()->nNode.GetNode().FindTableNode(); - if( pTblNd ) - { - SwUndoCpyTbl* pUndo = new SwUndoCpyTbl; - pUndo->SetTableSttIdx( pTblNd->GetIndex() ); - GetIDocumentUndoRedo().AppendUndo( pUndo ); - } - } - else if( rPam.HasMark() ) - { - SwUndoCpyDoc* pUndo = new SwUndoCpyDoc( rPam ); - pUndo->SetInsertRange( rPam, sal_False ); - GetIDocumentUndoRedo().AppendUndo( pUndo ); - } -} - -void SwDoc::ChgTOX(SwTOXBase & rTOX, const SwTOXBase & rNew) -{ - if (GetIDocumentUndoRedo().DoesUndo()) - { - GetIDocumentUndoRedo().DelAllUndoObj(); - - SwUndo * pUndo = new SwUndoTOXChange(&rTOX, rNew); - - GetIDocumentUndoRedo().AppendUndo(pUndo); - } - - rTOX = rNew; - - if (rTOX.ISA(SwTOXBaseSection)) - { - static_cast<SwTOXBaseSection &>(rTOX).Update(); - static_cast<SwTOXBaseSection &>(rTOX).UpdatePageNum(); - } -} - -String SwDoc::GetPaMDescr(const SwPaM & rPam) const -{ - String aResult; - bool bOK = false; - - if (rPam.GetNode(sal_True) == rPam.GetNode(sal_False)) - { - SwTxtNode * pTxtNode = rPam.GetNode(sal_True)->GetTxtNode(); - - if (0 != pTxtNode) - { - xub_StrLen nStart = rPam.Start()->nContent.GetIndex(); - xub_StrLen nEnd = rPam.End()->nContent.GetIndex(); - - aResult += String(SW_RES(STR_START_QUOTE)); - aResult += ShortenString(pTxtNode->GetTxt(). - Copy(nStart, nEnd - nStart), - nUndoStringLength, - String(SW_RES(STR_LDOTS))); - aResult += String(SW_RES(STR_END_QUOTE)); - - bOK = true; - } - } - else if (0 != rPam.GetNode(sal_True)) - { - if (0 != rPam.GetNode(sal_False)) - aResult += String(SW_RES(STR_PARAGRAPHS)); - - bOK = true; - } - - if (! bOK) - aResult += String("??", RTL_TEXTENCODING_ASCII_US); - - return aResult; -} - -SwField * SwDoc::GetField(const SwPosition & rPos) -{ - SwTxtFld * const pAttr = GetTxtFld(rPos); - - return (pAttr) ? const_cast<SwField *>( pAttr->GetFld().GetFld() ) : 0; -} - -SwTxtFld * SwDoc::GetTxtFld(const SwPosition & rPos) -{ - SwTxtNode * const pNode = rPos.nNode.GetNode().GetTxtNode(); - - return (pNode) - ? static_cast<SwTxtFld*>( pNode->GetTxtAttrForCharAt( - rPos.nContent.GetIndex(), RES_TXTATR_FIELD) ) - : 0; -} - -bool SwDoc::ContainsHiddenChars() const -{ - for( sal_uLong n = GetNodes().Count(); n; ) - { - SwNode* pNd = GetNodes()[ --n ]; - if ( ND_TEXTNODE == pNd->GetNodeType() && - ((SwTxtNode*)pNd)->HasHiddenCharAttribute( false ) ) - return true; - } - - return false; -} - -SwUnoCrsr* SwDoc::CreateUnoCrsr( const SwPosition& rPos, sal_Bool bTblCrsr ) -{ - SwUnoCrsr* pNew; - if( bTblCrsr ) - pNew = new SwUnoTableCrsr( rPos ); - else - pNew = new SwUnoCrsr( rPos ); - - pUnoCrsrTbl->Insert( pNew, pUnoCrsrTbl->Count() ); - return pNew; -} - -void SwDoc::ChkCondColls() -{ - for (sal_uInt16 n = 0; n < pTxtFmtCollTbl->Count(); n++) - { - SwTxtFmtColl *pColl = (*pTxtFmtCollTbl)[n]; - if (RES_CONDTXTFMTCOLL == pColl->Which()) - pColl->CallSwClientNotify( SwAttrHint(RES_CONDTXTFMTCOLL) ); - } -} - -uno::Reference< script::vba::XVBAEventProcessor > -SwDoc::GetVbaEventProcessor() -{ - if( !mxVbaEvents.is() && pDocShell && ooo::vba::isAlienWordDoc( *pDocShell ) ) - { - try - { - uno::Reference< frame::XModel > xModel( pDocShell->GetModel(), uno::UNO_SET_THROW ); - uno::Sequence< uno::Any > aArgs(1); - aArgs[0] <<= xModel; - mxVbaEvents.set( ooo::vba::createVBAUnoAPIServiceWithArgs( pDocShell, "com.sun.star.script.vba.VBATextEventProcessor" , aArgs ), uno::UNO_QUERY_THROW ); - } - catch( uno::Exception& ) - { - } - } - return mxVbaEvents; -} - -void SwDoc::setExternalData(::sw::tExternalDataType eType, - ::sw::tExternalDataPointer pPayload) -{ - m_externalData[eType] = pPayload; -} - -::sw::tExternalDataPointer SwDoc::getExternalData(::sw::tExternalDataType eType) -{ - return m_externalData[eType]; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |