2000-09-18 23:08:29 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2006-12-19 17:54:19 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* $RCSfile: doc.cxx,v $
|
2008-09-04 09:18:48 +00:00
|
|
|
* $Revision: 1.71 $
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* 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.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* 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).
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
2008-04-10 12:06:29 +00:00
|
|
|
* 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.
|
2000-09-18 23:08:29 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
2006-09-16 19:49:33 +00:00
|
|
|
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_sw.hxx"
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <doc.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <hintids.hxx>
|
|
|
|
|
2004-10-04 18:02:05 +00:00
|
|
|
#include <tools/shl.hxx>
|
|
|
|
#include <tools/globname.hxx>
|
|
|
|
|
2002-08-12 07:36:16 +00:00
|
|
|
#include <com/sun/star/i18n/WordType.hdl>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <com/sun/star/i18n/ForbiddenCharacters.hdl>
|
|
|
|
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
|
2007-07-17 12:05:50 +00:00
|
|
|
#include <com/sun/star/beans/NamedValue.hpp>
|
|
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
2008-02-26 13:04:30 +00:00
|
|
|
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
|
|
|
|
#include <com/sun/star/document/XDocumentProperties.hpp>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <comphelper/processfactory.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <tools/urlobj.hxx>
|
2004-01-06 17:14:23 +00:00
|
|
|
#include <tools/poly.hxx>
|
2009-07-28 19:03:24 +00:00
|
|
|
#include <tools/multisel.hxx>
|
2009-08-07 14:42:45 +00:00
|
|
|
#include <rtl/ustring.hxx>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <vcl/virdev.hxx>
|
|
|
|
#include <svtools/itemiter.hxx>
|
|
|
|
#include <sfx2/printer.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <svx/keepitem.hxx>
|
|
|
|
#include <svx/cscoitem.hxx>
|
|
|
|
#include <svx/brkitem.hxx>
|
|
|
|
#include <svx/linkmgr.hxx>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <svx/forbiddencharacterstable.hxx>
|
|
|
|
#include <svx/svdmodel.hxx>
|
2000-10-25 14:39:12 +00:00
|
|
|
#include <unotools/charclass.hxx>
|
2009-08-21 06:14:34 +00:00
|
|
|
#include <unotools/localedatawrapper.hxx>
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <swmodule.hxx>
|
|
|
|
#include <fmtpdsc.hxx>
|
|
|
|
#include <fmtanchr.hxx>
|
|
|
|
#include <fmtrfmrk.hxx>
|
|
|
|
#include <fmtinfmt.hxx>
|
|
|
|
#include <fmtfld.hxx>
|
|
|
|
#include <txtfld.hxx>
|
2004-09-20 12:51:02 +00:00
|
|
|
#include <dbfld.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <txtinet.hxx>
|
|
|
|
#include <txtrfmrk.hxx>
|
|
|
|
#include <frmatr.hxx>
|
|
|
|
#include <linkenum.hxx>
|
|
|
|
#include <errhdl.hxx>
|
|
|
|
#include <pagefrm.hxx>
|
|
|
|
#include <rootfrm.hxx>
|
|
|
|
#include <swtable.hxx>
|
|
|
|
#include <pam.hxx>
|
|
|
|
#include <ndtxt.hxx>
|
|
|
|
#include <swundo.hxx> // fuer die UndoIds
|
|
|
|
#include <undobj.hxx>
|
|
|
|
#include <pagedesc.hxx> //DTor
|
2002-08-12 07:36:16 +00:00
|
|
|
#include <breakit.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#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
|
2008-07-16 12:25:02 +00:00
|
|
|
#include <SwGrammarMarkUp.hxx>
|
2003-10-30 09:17:37 +00:00
|
|
|
#include <scriptinfo.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <acorrect.hxx> // Autokorrektur
|
|
|
|
#include <mdiexp.hxx> // Statusanzeige
|
|
|
|
#include <docstat.hxx>
|
|
|
|
#include <docary.hxx>
|
|
|
|
#include <redline.hxx>
|
|
|
|
#include <fldupde.hxx>
|
2001-03-08 20:28:23 +00:00
|
|
|
#include <swbaslnk.hxx>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <printdata.hxx>
|
2009-07-16 14:39:49 +00:00
|
|
|
#include <swprtopt.hxx>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <cmdid.h> // fuer den dflt - Printer in SetJob
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <statstr.hrc> // StatLine-String
|
2004-05-18 13:01:12 +00:00
|
|
|
#include <comcore.hrc>
|
|
|
|
#include <SwUndoTOXChange.hxx>
|
2004-09-08 14:17:22 +00:00
|
|
|
#include <SwUndoFmt.hxx>
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <unocrsr.hxx>
|
|
|
|
#include <docsh.hxx>
|
2009-08-21 06:14:34 +00:00
|
|
|
#include <docfld.hxx> // _SetGetExpFld
|
|
|
|
#include <docufld.hxx> // SwPostItField
|
|
|
|
#include <viewsh.hxx>
|
2009-08-25 13:10:30 +00:00
|
|
|
#include <shellres.hxx >
|
2009-08-21 06:14:34 +00:00
|
|
|
#include <txtfrm.hxx>
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
#include <vector>
|
2009-08-21 11:30:53 +00:00
|
|
|
#include <map>
|
2006-08-14 14:54:56 +00:00
|
|
|
|
|
|
|
#include <osl/diagnose.h>
|
|
|
|
#include <osl/interlck.h>
|
|
|
|
|
|
|
|
/* @@@MAINTAINABILITY-HORROR@@@
|
|
|
|
Probably unwanted dependency on SwDocShell
|
|
|
|
*/
|
2008-02-26 09:35:13 +00:00
|
|
|
// --> OD 2005-08-29 #125370#
|
2005-10-19 11:34:26 +00:00
|
|
|
#include <layouter.hxx>
|
|
|
|
// <--
|
2004-09-08 14:17:22 +00:00
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
using namespace ::com::sun::star;
|
2009-08-21 06:14:34 +00:00
|
|
|
using ::rtl::OUString;
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
// Seiten-Deskriptoren
|
|
|
|
SV_IMPL_PTRARR(SwPageDescs,SwPageDescPtr);
|
|
|
|
// Verzeichnisse
|
|
|
|
SV_IMPL_PTRARR( SwTOXTypes, SwTOXTypePtr )
|
|
|
|
// FeldTypen
|
|
|
|
SV_IMPL_PTRARR( SwFldTypes, SwFldTypePtr)
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
/** IInterface
|
|
|
|
*/
|
|
|
|
sal_Int32 SwDoc::acquire()
|
|
|
|
{
|
|
|
|
OSL_ASSERT(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_ASSERT(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;
|
2006-09-22 08:18:29 +00:00
|
|
|
// --> OD 2006-08-25 #i68949#
|
|
|
|
case CLIP_AS_CHARACTER_ANCHORED_WRITER_FLY_FRAME: return mbClipAsCharacterAnchoredWriterFlyFrames;
|
|
|
|
// <--
|
2006-10-27 11:02:57 +00:00
|
|
|
case UNIX_FORCE_ZERO_EXT_LEADING: return mbUnixForceZeroExtLeading;
|
2007-06-20 09:11:04 +00:00
|
|
|
case USE_OLD_PRINTER_METRICS: return mbOldPrinterMetrics;
|
2008-01-10 11:29:25 +00:00
|
|
|
case TABS_RELATIVE_TO_INDENT : return mbTabRelativeToIndent;
|
2008-09-04 09:18:48 +00:00
|
|
|
case PROTECT_FORM: return mbProtectForm;
|
2008-07-08 07:20:18 +00:00
|
|
|
// --> OD 2008-06-05 #i89181#
|
|
|
|
case TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: return mbTabAtLeftIndentForParagraphsInList;
|
|
|
|
// <--
|
2006-08-14 14:54:56 +00:00
|
|
|
// COMPATIBILITY FLAGS END
|
|
|
|
|
|
|
|
case BROWSE_MODE: return mbBrowseMode;
|
|
|
|
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;
|
|
|
|
default:
|
|
|
|
ASSERT(false, "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( USHORT n = 0; n < rNmTbl.Count(); ++n )
|
|
|
|
rNmTbl[n]->SetInvalidRule(TRUE);
|
|
|
|
|
|
|
|
UpdateNumRule();
|
|
|
|
|
2006-09-22 08:18:29 +00:00
|
|
|
if (pOutlineRule)
|
|
|
|
{
|
|
|
|
pOutlineRule->Validate();
|
|
|
|
// --> OD 2005-10-21 - counting of phantoms depends on <IsOldNumbering()>
|
|
|
|
pOutlineRule->SetCountPhantoms( !mbOldNumbering );
|
|
|
|
// <--
|
|
|
|
}
|
2006-08-14 14:54:56 +00:00
|
|
|
}
|
|
|
|
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:
|
2007-02-12 13:32:55 +00:00
|
|
|
mbConsiderWrapOnObjPos = value;
|
2006-08-14 14:54:56 +00:00
|
|
|
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;
|
|
|
|
|
2006-09-22 08:18:29 +00:00
|
|
|
// --> OD 2006-08-25 #i68949#
|
|
|
|
case CLIP_AS_CHARACTER_ANCHORED_WRITER_FLY_FRAME:
|
|
|
|
mbClipAsCharacterAnchoredWriterFlyFrames = value;
|
|
|
|
break;
|
|
|
|
// <--
|
2006-10-27 11:02:57 +00:00
|
|
|
case UNIX_FORCE_ZERO_EXT_LEADING:
|
|
|
|
mbUnixForceZeroExtLeading = value;
|
|
|
|
break;
|
2008-09-04 09:18:48 +00:00
|
|
|
case PROTECT_FORM:
|
|
|
|
mbProtectForm = value;
|
|
|
|
break;
|
2006-10-27 11:02:57 +00:00
|
|
|
|
2007-06-20 09:11:04 +00:00
|
|
|
case USE_OLD_PRINTER_METRICS:
|
|
|
|
mbOldPrinterMetrics = value;
|
|
|
|
break;
|
2008-01-10 11:29:25 +00:00
|
|
|
case TABS_RELATIVE_TO_INDENT:
|
|
|
|
mbTabRelativeToIndent = value;
|
|
|
|
break;
|
2008-07-08 07:20:18 +00:00
|
|
|
// --> OD 2008-06-05 #i89181#
|
|
|
|
case TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST:
|
|
|
|
mbTabAtLeftIndentForParagraphsInList = value;
|
2008-08-18 11:18:26 +00:00
|
|
|
break;
|
2008-07-08 07:20:18 +00:00
|
|
|
// <--
|
2006-08-14 14:54:56 +00:00
|
|
|
// COMPATIBILITY FLAGS END
|
|
|
|
|
|
|
|
case BROWSE_MODE:
|
|
|
|
mbBrowseMode = 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;
|
|
|
|
default:
|
|
|
|
ASSERT(false, "Invalid setting id");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
const i18n::ForbiddenCharacters*
|
2006-08-14 14:54:56 +00:00
|
|
|
SwDoc::getForbiddenCharacters(/*[in]*/ USHORT nLang, /*[in]*/ bool bLocaleData ) const
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
const i18n::ForbiddenCharacters* pRet = 0;
|
2006-08-14 14:54:56 +00:00
|
|
|
if( xForbiddenCharsTable.isValid() )
|
|
|
|
pRet = xForbiddenCharsTable->GetForbiddenCharacters( nLang, FALSE );
|
|
|
|
if( bLocaleData && !pRet && pBreakIt )
|
|
|
|
pRet = &pBreakIt->GetForbidden( (LanguageType)nLang );
|
|
|
|
return pRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::setForbiddenCharacters(/*[in]*/ USHORT nLang,
|
2007-09-27 07:32:40 +00:00
|
|
|
/*[in]*/ const i18n::ForbiddenCharacters& rFChars )
|
2006-08-14 14:54:56 +00:00
|
|
|
{
|
|
|
|
if( !xForbiddenCharsTable.isValid() )
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
uno::Reference<
|
|
|
|
lang::XMultiServiceFactory > xMSF =
|
2006-08-14 14:54:56 +00:00
|
|
|
::comphelper::getProcessServiceFactory();
|
|
|
|
xForbiddenCharsTable = new SvxForbiddenCharactersTable( xMSF );
|
|
|
|
}
|
|
|
|
xForbiddenCharsTable->SetForbiddenCharacters( nLang, rFChars );
|
|
|
|
if( pDrawModel )
|
|
|
|
{
|
|
|
|
pDrawModel->SetForbiddenCharsTable( xForbiddenCharsTable );
|
|
|
|
if( !mbInReading )
|
|
|
|
pDrawModel->ReformatAllTextObjects();
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pLayout && !mbInReading )
|
|
|
|
{
|
|
|
|
pLayout->StartAllAction();
|
|
|
|
pLayout->InvalidateAllCntnt();
|
|
|
|
pLayout->EndAllAction();
|
|
|
|
}
|
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
|
|
|
|
vos::ORef<SvxForbiddenCharactersTable>& SwDoc::getForbiddenCharacterTable()
|
|
|
|
{
|
|
|
|
if( !xForbiddenCharsTable.isValid() )
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
uno::Reference<
|
|
|
|
lang::XMultiServiceFactory > xMSF =
|
2006-08-14 14:54:56 +00:00
|
|
|
::comphelper::getProcessServiceFactory();
|
|
|
|
xForbiddenCharsTable = new SvxForbiddenCharactersTable( xMSF );
|
|
|
|
}
|
|
|
|
return xForbiddenCharsTable;
|
|
|
|
}
|
|
|
|
|
|
|
|
const vos::ORef<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;
|
|
|
|
}
|
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
SwFldUpdateFlags SwDoc::getFieldUpdateFlags( /*[in]*/bool bGlobalSettings ) const
|
2006-08-14 14:54:56 +00:00
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
SwFldUpdateFlags eRet = eFldUpdMode;
|
|
|
|
if( bGlobalSettings && AUTOUPD_GLOBALSETTING == eRet )
|
|
|
|
eRet = SW_MOD()->GetFldUpdateFlags(get(IDocumentSettingAccess::HTML_MODE));
|
|
|
|
return eRet;
|
2006-08-14 14:54:56 +00:00
|
|
|
}
|
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
void SwDoc::setFieldUpdateFlags(/*[in]*/SwFldUpdateFlags eMode )
|
2006-08-14 14:54:56 +00:00
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
eFldUpdMode = eMode;
|
2006-08-14 14:54:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SwCharCompressType SwDoc::getCharacterCompressionType() const
|
|
|
|
{
|
|
|
|
return eChrCmprType;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::setCharacterCompressionType( /*[in]*/SwCharCompressType n )
|
|
|
|
{
|
|
|
|
if( eChrCmprType != n )
|
|
|
|
{
|
|
|
|
eChrCmprType = n;
|
|
|
|
if( pDrawModel )
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
pDrawModel->SetCharCompressType( static_cast<UINT16>(n) );
|
2006-08-14 14:54:56 +00:00
|
|
|
if( !mbInReading )
|
|
|
|
pDrawModel->ReformatAllTextObjects();
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pLayout && !mbInReading )
|
|
|
|
{
|
|
|
|
pLayout->StartAllAction();
|
|
|
|
pLayout->InvalidateAllCntnt();
|
|
|
|
pLayout->EndAllAction();
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bCallPrtDataChanged &&
|
|
|
|
// --> FME 2005-01-21 #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;
|
|
|
|
}
|
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
void SwDoc::setVirtualDevice(/*[in]*/ VirtualDevice* pVd,/*[in]*/ bool bDeleteOld, /*[in]*/ bool )
|
2006-08-14 14:54:56 +00:00
|
|
|
{
|
|
|
|
if ( pVirDev != pVd )
|
|
|
|
{
|
|
|
|
if ( bDeleteOld )
|
|
|
|
delete pVirDev;
|
|
|
|
pVirDev = pVd;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 )
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
VirtualDevice* pMyVirDev = getVirtualDevice( true );
|
2006-08-14 14:54:56 +00:00
|
|
|
if ( !bNewHiRes )
|
2007-09-27 07:32:40 +00:00
|
|
|
pMyVirDev->SetReferenceDevice( VirtualDevice::REFDEV_MODE06 );
|
2006-08-14 14:54:56 +00:00
|
|
|
else
|
2007-09-27 07:32:40 +00:00
|
|
|
pMyVirDev->SetReferenceDevice( VirtualDevice::REFDEV_MODE_MSO1 );
|
2006-08-14 14:54:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// --> FME 2005-01-21 #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()
|
|
|
|
getPrinter( true );
|
|
|
|
// <--
|
|
|
|
}
|
|
|
|
|
|
|
|
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 )
|
|
|
|
{
|
|
|
|
BOOL bCheckPageDescs = 0 == pPrt;
|
|
|
|
BOOL bDataChanged = FALSE;
|
|
|
|
|
|
|
|
if ( pPrt )
|
|
|
|
{
|
|
|
|
if ( pPrt->GetName() == rJobSetup.GetPrinterName() )
|
|
|
|
{
|
|
|
|
if ( pPrt->GetJobSetup() != rJobSetup )
|
|
|
|
{
|
|
|
|
pPrt->SetJobSetup( rJobSetup );
|
|
|
|
bDataChanged = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
delete pPrt, pPrt = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !pPrt )
|
|
|
|
{
|
|
|
|
//Das ItemSet wird vom Sfx geloescht!
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
SfxItemSet *pSet = new SfxItemSet( GetAttrPool(),
|
2006-08-14 14:54:56 +00:00
|
|
|
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 = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( bDataChanged && !get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE) )
|
|
|
|
PrtDataChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
SwPrintData* SwDoc::getPrintData() const
|
|
|
|
{
|
|
|
|
return pPrtData;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::setPrintData(/*[in]*/ const SwPrintData& rPrtData )
|
|
|
|
{
|
|
|
|
if(!pPrtData)
|
|
|
|
pPrtData = new SwPrintData;
|
|
|
|
*pPrtData = rPrtData;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Implementations the next Interface here
|
|
|
|
*/
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Dokumenteditieren (Doc-SS) zum Fuellen des Dokuments
|
|
|
|
* durch den RTF Parser und fuer die EditShell.
|
|
|
|
*/
|
2001-02-21 11:45:25 +00:00
|
|
|
void SwDoc::ChgDBData(const SwDBData& rNewData)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2001-02-21 11:45:25 +00:00
|
|
|
if( rNewData != aDBData )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2001-02-21 11:45:25 +00:00
|
|
|
aDBData = rNewData;
|
2000-09-18 23:08:29 +00:00
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
GetSysFldType(RES_DBNAMEFLD)->UpdateFlds();
|
|
|
|
}
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
bool SwDoc::SplitNode( const SwPosition &rPos, bool bChkTableStart )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
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 ( DoesUndo() )
|
|
|
|
{
|
|
|
|
ClearRedo();
|
|
|
|
// einfuegen vom Undo-Object, z.Z. nur beim TextNode
|
|
|
|
if( pNode->IsTxtNode() )
|
|
|
|
AppendUndo( pUndo = new SwUndoSplitNode( this, rPos, bChkTableStart ));
|
|
|
|
}
|
|
|
|
|
|
|
|
//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() )
|
|
|
|
{
|
|
|
|
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() )
|
2006-08-14 14:54:56 +00:00
|
|
|
|| ( pNd->IsEndNode() && pNd->StartOfSectionNode()->IsTableNode() )
|
2000-09-18 23:08:29 +00:00
|
|
|
|| 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, FALSE) &&
|
|
|
|
SFX_ITEM_SET != pFrmFmt->GetItemState( RES_BREAK, 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,
|
|
|
|
FALSE, &pItem ) )
|
|
|
|
{
|
2008-06-13 08:32:12 +00:00
|
|
|
pTxtNd->SetAttr( *pItem );
|
|
|
|
pFrmFmt->ResetFmtAttr( RES_PAGEDESC );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if( SFX_ITEM_SET == pFrmFmt->GetItemState( RES_BREAK,
|
|
|
|
FALSE, &pItem ) )
|
|
|
|
{
|
2008-06-13 08:32:12 +00:00
|
|
|
pTxtNd->SetAttr( *pItem );
|
|
|
|
pFrmFmt->ResetFmtAttr( RES_BREAK );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pUndo )
|
|
|
|
pUndo->SetTblFlag();
|
|
|
|
SetModified();
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SvULongs aBkmkArr( 15, 15 );
|
|
|
|
_SaveCntntIdx( this, rPos.nNode.GetIndex(), rPos.nContent.GetIndex(),
|
|
|
|
aBkmkArr, SAVEFLY_SPLIT );
|
2008-02-26 09:35:13 +00:00
|
|
|
if( 0 != ( pNode = pNode->SplitCntntNode( rPos ) ))
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
// verschiebe noch alle Bookmarks/TOXMarks/FlyAtCnt
|
|
|
|
if( aBkmkArr.Count() )
|
|
|
|
_RestoreCntntIdx( this, aBkmkArr, rPos.nNode.GetIndex()-1, 0, TRUE );
|
|
|
|
|
|
|
|
if( IsRedlineOn() || (!IsIgnoreRedline() && pRedlineTbl->Count() ))
|
|
|
|
{
|
|
|
|
SwPaM aPam( rPos );
|
|
|
|
aPam.SetMark();
|
|
|
|
aPam.Move( fnMoveBackward );
|
|
|
|
if( IsRedlineOn() )
|
2007-09-27 07:32:40 +00:00
|
|
|
AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true);
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
SplitRedline( aPam );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SetModified();
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
bool SwDoc::AppendTxtNode( SwPosition& rPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Neuen Node vor EndOfContent erzeugen.
|
|
|
|
*/
|
|
|
|
SwTxtNode *pCurNode = GetNodes()[ rPos.nNode ]->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( DoesUndo() )
|
|
|
|
{
|
|
|
|
ClearRedo();
|
|
|
|
AppendUndo( new SwUndoInsert( rPos.nNode ));
|
|
|
|
}
|
|
|
|
|
|
|
|
if( IsRedlineOn() || (!IsIgnoreRedline() && pRedlineTbl->Count() ))
|
|
|
|
{
|
|
|
|
SwPaM aPam( rPos );
|
|
|
|
aPam.SetMark();
|
|
|
|
aPam.Move( fnMoveBackward );
|
|
|
|
if( IsRedlineOn() )
|
2007-09-27 07:32:40 +00:00
|
|
|
AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true);
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
SplitRedline( aPam );
|
|
|
|
}
|
|
|
|
|
|
|
|
SetModified();
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
bool SwDoc::Insert( const SwPaM &rRg, const String &rStr, bool bHintExpand )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if( DoesUndo() )
|
|
|
|
ClearRedo();
|
|
|
|
|
|
|
|
const SwPosition* pPos = rRg.GetPoint();
|
|
|
|
|
|
|
|
if( pACEWord ) // Aufnahme in die Autokorrektur
|
|
|
|
{
|
|
|
|
if( 1 == rStr.Len() && pACEWord->IsDeleted() )
|
|
|
|
pACEWord->CheckChar( *pPos, rStr.GetChar( 0 ) );
|
|
|
|
delete pACEWord, pACEWord = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SwTxtNode *pNode = pPos->nNode.GetNode().GetTxtNode();
|
|
|
|
if(!pNode)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
const USHORT nInsMode = bHintExpand ? INS_EMPTYEXPAND
|
|
|
|
: INS_NOHINTEXPAND;
|
|
|
|
SwDataChanged aTmp( rRg, 0 );
|
|
|
|
|
|
|
|
if( !DoesUndo() || !DoesGroupUndo() )
|
|
|
|
{
|
|
|
|
pNode->Insert( rStr, pPos->nContent, nInsMode );
|
|
|
|
|
|
|
|
if( DoesUndo() )
|
|
|
|
AppendUndo( new SwUndoInsert( pPos->nNode,
|
|
|
|
pPos->nContent.GetIndex(), rStr.Len() ));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ // ist Undo und Gruppierung eingeschaltet, ist alles anders !
|
|
|
|
USHORT nUndoSize = pUndos->Count();
|
|
|
|
xub_StrLen nInsPos = pPos->nContent.GetIndex();
|
2004-05-18 13:01:12 +00:00
|
|
|
SwUndoInsert * pUndo = NULL; // #111827#
|
2000-10-25 14:39:12 +00:00
|
|
|
CharClass& rCC = GetAppCharClass();
|
|
|
|
|
2004-05-18 13:01:12 +00:00
|
|
|
// -> #111827#
|
|
|
|
bool bNewUndo = false;
|
|
|
|
if( 0 == nUndoSize)
|
|
|
|
bNewUndo = true;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pUndo = (SwUndoInsert*)(*pUndos)[ --nUndoSize ];
|
|
|
|
|
|
|
|
switch (pUndo->GetId())
|
|
|
|
{
|
|
|
|
case UNDO_INSERT:
|
|
|
|
case UNDO_TYPING:
|
|
|
|
bNewUndo = !pUndo->CanGrouping( *pPos );
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
bNewUndo = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// <- #111827#
|
|
|
|
|
|
|
|
if (bNewUndo)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
pUndo = new SwUndoInsert( pPos->nNode, nInsPos, 0,
|
2000-10-25 14:39:12 +00:00
|
|
|
!rCC.isLetterNumeric( rStr, 0 ) );
|
2000-09-18 23:08:29 +00:00
|
|
|
AppendUndo( pUndo );
|
|
|
|
}
|
|
|
|
|
2004-05-18 13:01:12 +00:00
|
|
|
pNode->Insert( rStr, pPos->nContent, nInsMode );
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
for( xub_StrLen i = 0; i < rStr.Len(); ++i )
|
|
|
|
{
|
|
|
|
nInsPos++;
|
|
|
|
// wenn CanGrouping() TRUE returnt, ist schon alles erledigt
|
|
|
|
if( !pUndo->CanGrouping( rStr.GetChar( i ) ))
|
|
|
|
{
|
|
|
|
pUndo = new SwUndoInsert( pPos->nNode, nInsPos, 1,
|
2000-10-25 14:39:12 +00:00
|
|
|
!rCC.isLetterNumeric( rStr, i ) );
|
2000-09-18 23:08:29 +00:00
|
|
|
AppendUndo( pUndo );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( IsRedlineOn() || (!IsIgnoreRedline() && pRedlineTbl->Count() ))
|
|
|
|
{
|
|
|
|
SwPaM aPam( pPos->nNode, aTmp.GetCntnt(),
|
|
|
|
pPos->nNode, pPos->nContent.GetIndex());
|
|
|
|
if( IsRedlineOn() )
|
2007-09-27 07:32:40 +00:00
|
|
|
AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true);
|
2000-09-18 23:08:29 +00:00
|
|
|
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_CNTNT,
|
|
|
|
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 );
|
|
|
|
}
|
2000-11-28 19:40:08 +00:00
|
|
|
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 );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-10-04 18:02:05 +00:00
|
|
|
SwFlyFrmFmt* SwDoc::Insert(const SwPaM &rRg, const svt::EmbeddedObjectRef& xObj,
|
2000-09-18 23:08:29 +00:00
|
|
|
const SfxItemSet* pFlyAttrSet,
|
|
|
|
const SfxItemSet* pGrfAttrSet,
|
|
|
|
SwFrmFmt* pFrmFmt )
|
|
|
|
{
|
|
|
|
if( !pFrmFmt )
|
|
|
|
{
|
|
|
|
USHORT nId = RES_POOLFRM_OLE;
|
2004-10-04 18:02:05 +00:00
|
|
|
SvGlobalName aClassName( xObj->getClassID() );
|
|
|
|
if (SotExchange::IsMath(aClassName))
|
2000-09-18 23:08:29 +00:00
|
|
|
nId = RES_POOLFRM_FORMEL;
|
|
|
|
|
|
|
|
pFrmFmt = GetFrmFmtFromPool( nId );
|
|
|
|
}
|
|
|
|
return _InsNoTxtNode( *rRg.GetPoint(), GetNodes().MakeOLENode(
|
|
|
|
SwNodeIndex( GetNodes().GetEndOfAutotext() ),
|
2004-10-04 18:02:05 +00:00
|
|
|
xObj,
|
2000-09-18 23:08:29 +00:00
|
|
|
pDfltGrfFmtColl ),
|
|
|
|
pFlyAttrSet, pGrfAttrSet,
|
|
|
|
pFrmFmt );
|
|
|
|
}
|
|
|
|
|
2003-09-01 11:36:24 +00:00
|
|
|
SwFlyFrmFmt* SwDoc::InsertOLE(const SwPaM &rRg, const String& rObjName,
|
2006-10-13 10:08:43 +00:00
|
|
|
sal_Int64 nAspect,
|
2000-11-27 14:38:15 +00:00
|
|
|
const SfxItemSet* pFlyAttrSet,
|
|
|
|
const SfxItemSet* pGrfAttrSet,
|
|
|
|
SwFrmFmt* pFrmFmt )
|
|
|
|
{
|
|
|
|
if( !pFrmFmt )
|
|
|
|
pFrmFmt = GetFrmFmtFromPool( RES_POOLFRM_OLE );
|
|
|
|
|
2006-10-13 10:08:43 +00:00
|
|
|
return _InsNoTxtNode( *rRg.GetPoint(),
|
|
|
|
GetNodes().MakeOLENode(
|
|
|
|
SwNodeIndex( GetNodes().GetEndOfAutotext() ),
|
|
|
|
rObjName,
|
|
|
|
nAspect,
|
|
|
|
pDfltGrfFmtColl,
|
|
|
|
0 ),
|
2000-11-27 14:38:15 +00:00
|
|
|
pFlyAttrSet, pGrfAttrSet,
|
|
|
|
pFrmFmt );
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
/*************************************************************************
|
|
|
|
|* SwDoc::GetFldType()
|
|
|
|
|* Beschreibung: liefert den am Doc eingerichteten Feldtypen zurueck
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
SwFieldType *SwDoc::GetSysFldType( const USHORT eWhich ) const
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
for( USHORT i = 0; i < INIT_FLDTYPES; ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
if( eWhich == (*pFldTypes)[i]->Which() )
|
|
|
|
return (*pFldTypes)[i];
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/*************************************************************************
|
|
|
|
* void SetDocStat( const SwDocStat& rStat );
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
void SwDoc::SetDocStat( const SwDocStat& rStat )
|
|
|
|
{
|
|
|
|
*pDocStat = rStat;
|
|
|
|
}
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
const SwDocStat& SwDoc::GetDocStat() const
|
|
|
|
{
|
|
|
|
return *pDocStat;
|
|
|
|
}
|
2002-08-13 06:09:29 +00:00
|
|
|
|
2009-08-21 06:14:34 +00:00
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
struct _PostItFld : public _SetGetExpFld
|
|
|
|
{
|
|
|
|
_PostItFld( const SwNodeIndex& rNdIdx, const SwTxtFld* pFld, const SwIndex* pIdx = 0 )
|
|
|
|
: _SetGetExpFld( rNdIdx, pFld, pIdx ) {}
|
|
|
|
|
|
|
|
USHORT GetPageNo( const StringRangeEnumerator &rRangeEnum,
|
|
|
|
const std::set< sal_Int32 > &rPossiblePages,
|
|
|
|
BOOL bRgt, BOOL bLft,
|
|
|
|
USHORT& rVirtPgNo, USHORT& rLineNo );
|
|
|
|
|
|
|
|
SwPostItField* GetPostIt() const
|
|
|
|
{
|
|
|
|
return (SwPostItField*) GetFld()->GetFld().GetFld();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
USHORT _PostItFld::GetPageNo(
|
|
|
|
const StringRangeEnumerator &rRangeEnum,
|
|
|
|
const std::set< sal_Int32 > &rPossiblePages,
|
|
|
|
BOOL bRgt, BOOL bLft, /* TLPDF both should not be needed since rMulti should only include the correct pages as stored in GetValidPagesSet */
|
|
|
|
/* out */ USHORT& rVirtPgNo, /* out */ USHORT& 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;
|
|
|
|
USHORT nPos = GetCntnt();
|
|
|
|
SwClientIter aIter( (SwModify &)GetFld()->GetTxtNode() );
|
|
|
|
for( SwTxtFrm* pFrm = (SwTxtFrm*)aIter.First( TYPE( SwFrm ));
|
|
|
|
pFrm; pFrm = (SwTxtFrm*)aIter.Next() )
|
|
|
|
{
|
|
|
|
if( pFrm->GetOfst() > nPos ||
|
|
|
|
(pFrm->HasFollow() && pFrm->GetFollow()->GetOfst() <= nPos) )
|
|
|
|
continue;
|
|
|
|
USHORT nPgNo = pFrm->GetPhyPageNum();
|
|
|
|
BOOL bRight = pFrm->OnRightPage();
|
|
|
|
if( rRangeEnum.hasValue( nPgNo, &rPossiblePages ) &&
|
|
|
|
( (bRight && bRgt) || (!bRight && bLft) ) )
|
|
|
|
{
|
|
|
|
rLineNo = (USHORT)(pFrm->GetLineCount( nPos ) +
|
|
|
|
pFrm->GetAllLines() - pFrm->GetThisLines());
|
|
|
|
rVirtPgNo = pFrm->GetVirtPageNum();
|
|
|
|
return nPgNo;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void lcl_GetPostIts(
|
|
|
|
IDocumentFieldsAccess* pIDFA,
|
|
|
|
_SetGetExpFlds& rSrtLst )
|
|
|
|
{
|
|
|
|
SwFieldType* pFldType = pIDFA->GetSysFldType( RES_POSTITFLD );
|
|
|
|
DBG_ASSERT( pFldType, "kein PostItType ? ");
|
|
|
|
|
|
|
|
if( pFldType->GetDepends() )
|
|
|
|
{
|
|
|
|
// Modify-Object gefunden, trage alle Felder ins Array ein
|
|
|
|
SwClientIter aIter( *pFldType );
|
|
|
|
SwClient* pLast;
|
|
|
|
const SwTxtFld* pTxtFld;
|
|
|
|
|
|
|
|
for( pLast = aIter.First( TYPE(SwFmtFld)); pLast; pLast = aIter.Next() )
|
|
|
|
if( 0 != ( pTxtFld = ((SwFmtFld*)pLast)->GetTxtFld() ) &&
|
|
|
|
pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
|
|
|
|
{
|
|
|
|
SwNodeIndex aIdx( pTxtFld->GetTxtNode() );
|
|
|
|
_PostItFld* pNew = new _PostItFld( aIdx, pTxtFld );
|
|
|
|
rSrtLst.Insert( pNew );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void lcl_FormatPostIt(
|
|
|
|
IDocumentContentOperations* pIDCO,
|
|
|
|
SwPaM& aPam,
|
|
|
|
SwPostItField* pField,
|
2009-08-21 11:30:53 +00:00
|
|
|
bool bNewPage, bool bIsFirstPostIt,
|
2009-08-21 06:14:34 +00:00
|
|
|
USHORT nPageNo, USHORT nLineNo )
|
|
|
|
{
|
|
|
|
static char __READONLY_DATA sTmp[] = " : ";
|
|
|
|
|
|
|
|
DBG_ASSERT( ViewShell::GetShellRes(), "missing ShellRes" );
|
|
|
|
|
2009-08-21 11:30:53 +00:00
|
|
|
if (bNewPage)
|
2009-08-21 13:32:05 +00:00
|
|
|
{
|
|
|
|
pIDCO->Insert( aPam, SvxFmtBreakItem( SVX_BREAK_PAGE_AFTER, RES_BREAK ), 0 );
|
|
|
|
pIDCO->SplitNode( *aPam.GetPoint(), false );
|
|
|
|
}
|
2009-08-21 11:30:53 +00:00
|
|
|
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 );
|
2009-08-21 06:14:34 +00:00
|
|
|
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 += ' ';
|
|
|
|
aStr += GetAppLocaleData().getDate( pField->GetDate() );
|
|
|
|
pIDCO->Insert( aPam, aStr, true );
|
|
|
|
|
|
|
|
pIDCO->SplitNode( *aPam.GetPoint(), false );
|
|
|
|
aStr = pField->GetPar2();
|
|
|
|
#if defined( WIN ) || defined( WNT ) || defined( PM2 )
|
|
|
|
// Bei Windows und Co alle CR rausschmeissen
|
|
|
|
aStr.EraseAllChars( '\r' );
|
|
|
|
#endif
|
|
|
|
pIDCO->Insert( aPam, aStr, true );
|
|
|
|
}
|
|
|
|
|
2009-07-16 14:39:49 +00:00
|
|
|
|
2009-08-07 14:42:45 +00:00
|
|
|
void SwDoc::CalculatePagesForPrinting(
|
2009-08-21 06:14:34 +00:00
|
|
|
/* out */ SwPrintUIOptions &rOptions,
|
2009-08-04 12:13:41 +00:00
|
|
|
bool bIsPDFExport,
|
2009-07-16 14:39:49 +00:00
|
|
|
sal_Int32 nDocPageCount )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( pLayout, "no layout present" );
|
|
|
|
if (!pLayout)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// properties to take into account when calcualting the set of pages
|
2009-08-14 13:56:56 +00:00
|
|
|
// (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();
|
2009-08-07 14:42:45 +00:00
|
|
|
// TLPDF, TODO: remove bPrintReverse, should be handled by PLs framework now
|
2009-08-14 13:56:56 +00:00
|
|
|
//TLPDF bool bPrintReverse = rOptions.getBoolValue( C2U( "PrintReverseOrder" ), false );
|
|
|
|
bool bPrintEmptyPages = rOptions.IsPrintEmptyPages( bIsPDFExport );
|
2009-07-16 14:39:49 +00:00
|
|
|
|
|
|
|
Range aPages( 1, nDocPageCount );
|
|
|
|
|
|
|
|
MultiSelection aMulti( aPages );
|
|
|
|
aMulti.SetTotalRange( Range( 0, RANGE_MAX ) );
|
|
|
|
aMulti.Select( aPages );
|
|
|
|
|
|
|
|
const SwPageFrm *pStPage = (SwPageFrm*)pLayout->Lower();
|
|
|
|
const SwFrm *pEndPage = pStPage;
|
|
|
|
|
|
|
|
USHORT nFirstPageNo = 0;
|
|
|
|
USHORT nLastPageNo = 0;
|
|
|
|
USHORT nPageNo = 1;
|
|
|
|
|
|
|
|
for( USHORT i = 1; i <= (USHORT)aPages.Max(); ++i )
|
|
|
|
{
|
|
|
|
if( i < (USHORT)aPages.Min() )
|
|
|
|
{
|
|
|
|
if( !pStPage->GetNext() )
|
|
|
|
break;
|
|
|
|
pStPage = (SwPageFrm*)pStPage->GetNext();
|
|
|
|
pEndPage= pStPage;
|
|
|
|
}
|
|
|
|
else if( i == (USHORT)aPages.Min() )
|
|
|
|
{
|
|
|
|
nFirstPageNo = i;
|
|
|
|
nLastPageNo = nFirstPageNo;
|
|
|
|
if( !pStPage->GetNext() || (i == (USHORT)aPages.Max()) )
|
|
|
|
break;
|
|
|
|
pEndPage = pStPage->GetNext();
|
|
|
|
}
|
|
|
|
else if( i > (USHORT)aPages.Min() )
|
|
|
|
{
|
|
|
|
nLastPageNo = i;
|
|
|
|
if( !pEndPage->GetNext() || (i == (USHORT)aPages.Max()) )
|
|
|
|
break;
|
|
|
|
pEndPage = pEndPage->GetNext();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DBG_ASSERT( 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 ), 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
|
|
|
|
|
2009-08-10 12:19:26 +00:00
|
|
|
#ifdef TL_NOT_NOW /*TLPDF*/
|
2009-07-16 14:39:49 +00:00
|
|
|
if (bPrintReverse)
|
|
|
|
{
|
|
|
|
const SwFrm *pTmp = pStPage;
|
|
|
|
pStPage = (SwPageFrm*)pEndPage;
|
|
|
|
pEndPage = pTmp;
|
|
|
|
nPageNo = nLastPageNo;
|
|
|
|
}
|
|
|
|
else
|
2009-08-10 12:19:26 +00:00
|
|
|
#endif // TL_NOT_NOW /*TLPDF*/
|
2009-07-16 14:39:49 +00:00
|
|
|
nPageNo = nFirstPageNo;
|
|
|
|
|
2009-08-14 13:56:56 +00:00
|
|
|
std::set< sal_Int32 > &rValidPages = rOptions.GetValidPagesSet();
|
2009-08-25 13:10:30 +00:00
|
|
|
std::map< sal_Int32, const SwPageFrm * > &rValidStartFrms = rOptions.GetValidStartFrames();
|
2009-07-16 14:39:49 +00:00
|
|
|
rValidPages.clear();
|
|
|
|
rValidStartFrms.clear();
|
|
|
|
while ( pStPage )
|
|
|
|
{
|
|
|
|
const BOOL bRightPg = pStPage->OnRightPage();
|
|
|
|
if ( aMulti.IsSelected( nPageNo ) &&
|
2009-08-14 13:56:56 +00:00
|
|
|
( (bRightPg && bPrintRightPages) ||
|
|
|
|
(!bRightPg && bPrintLeftPages) ) )
|
2009-07-16 14:39:49 +00:00
|
|
|
{
|
|
|
|
// --> FME 2005-12-12 #b6354161# Feature - Print empty pages
|
|
|
|
if ( bPrintEmptyPages || pStPage->Frm().Height() )
|
|
|
|
// <--
|
|
|
|
{
|
|
|
|
// pStPage->GetUpper()->Paint( pStPage->Frm() );
|
|
|
|
rValidPages.insert( nPageNo );
|
|
|
|
rValidStartFrms[ nPageNo ] = pStPage;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pStPage == pEndPage )
|
|
|
|
{
|
|
|
|
pStPage = 0;
|
|
|
|
}
|
2009-08-10 12:19:26 +00:00
|
|
|
#ifdef TL_NOT_NOW /*TLPDF*/
|
2009-07-16 14:39:49 +00:00
|
|
|
else if ( bPrintReverse )
|
|
|
|
{
|
|
|
|
--nPageNo;
|
|
|
|
pStPage = (SwPageFrm*)pStPage->GetPrev();
|
|
|
|
}
|
2009-08-10 12:19:26 +00:00
|
|
|
#endif // TL_NOT_NOW /*TLPDF*/
|
2009-07-16 14:39:49 +00:00
|
|
|
else
|
|
|
|
{ ++nPageNo;
|
|
|
|
pStPage = (SwPageFrm*)pStPage->GetNext();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-08-21 06:14:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// 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;
|
|
|
|
if (bIsPDFExport)
|
|
|
|
{
|
|
|
|
// TLPDF ?? m_pPrintUIOptions->getValue( C2U("Selection") );
|
|
|
|
aPageRange = rOptions.getStringValue( "PageRange", OUString() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// PageContent :
|
|
|
|
// 0 -> print all pages
|
|
|
|
// 1 -> print range according to PageRange
|
|
|
|
// 2 -> print selection
|
|
|
|
if (1 == rOptions.getIntValue( "PrintContent", 0 ))
|
|
|
|
aPageRange = rOptions.getStringValue( "PageRange", OUString() );
|
|
|
|
}
|
|
|
|
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 );
|
|
|
|
}
|
|
|
|
rOptions.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, rOptions.GetPagesToPrint(),
|
|
|
|
1, nDocPageCount, 0, &rOptions.GetValidPagesSet() );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SwDoc::UpdatePagesForPrintingWithPostItData(
|
|
|
|
/* out */ SwPrintUIOptions &rOptions,
|
2009-08-25 13:10:30 +00:00
|
|
|
bool bIsPDFExport,
|
2009-08-21 06:14:34 +00:00
|
|
|
sal_Int32 nDocPageCount )
|
|
|
|
{
|
|
|
|
|
|
|
|
sal_Int16 nPostItMode = (sal_Int16) rOptions.getIntValue( "PrintAnnotationMode", 0 );
|
|
|
|
DBG_ASSERT(nPostItMode == POSTITS_NONE || rOptions.HasPostItData(),
|
|
|
|
"print post-its without post-it data?" );
|
|
|
|
const USHORT nPostItCount = rOptions.HasPostItData() ? rOptions.m_pPostItFields->Count() : 0;
|
|
|
|
if (nPostItMode != POSTITS_NONE && nPostItCount > 0)
|
|
|
|
{
|
|
|
|
SET_CURR_SHELL( rOptions.m_pPostItShell );
|
|
|
|
|
|
|
|
// clear document and move to end of it
|
|
|
|
SwPaM aPam( rOptions.m_pPostItDoc->GetNodes().GetEndOfContent() );
|
|
|
|
aPam.Move( fnMoveBackward, fnGoDoc );
|
|
|
|
aPam.SetMark();
|
|
|
|
aPam.Move( fnMoveForward, fnGoDoc );
|
|
|
|
rOptions.m_pPostItDoc->Delete( aPam );
|
|
|
|
|
|
|
|
const StringRangeEnumerator aRangeEnum( rOptions.GetPageRange(), 1, nDocPageCount, 0 );
|
|
|
|
|
2009-08-21 11:30:53 +00:00
|
|
|
// 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
|
2009-08-25 13:10:30 +00:00
|
|
|
std::map< sal_Int32, sal_Int32 > aPostItLastStartPageNum;
|
2009-08-21 11:30:53 +00:00
|
|
|
|
|
|
|
// 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
|
|
|
|
USHORT nVirtPg = 0, nLineNo = 0, nLastPageNum = 0, nPhyPageNum = 0;
|
|
|
|
bool bIsFirstPostIt = true;
|
2009-08-21 06:14:34 +00:00
|
|
|
for (USHORT i = 0; i < nPostItCount; ++i)
|
|
|
|
{
|
|
|
|
_PostItFld& rPostIt = (_PostItFld&)*(*rOptions.m_pPostItFields)[ i ];
|
2009-08-21 11:30:53 +00:00
|
|
|
nLastPageNum = nPhyPageNum;
|
|
|
|
nPhyPageNum = rPostIt.GetPageNo(
|
2009-08-21 06:14:34 +00:00
|
|
|
aRangeEnum, rOptions.GetValidPagesSet(),
|
|
|
|
true /*TLPDF bRgt*/, true /*TLPDF bLft*/, nVirtPg, nLineNo );
|
|
|
|
if (nPhyPageNum)
|
2009-08-21 11:30:53 +00:00
|
|
|
{
|
|
|
|
// 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;
|
|
|
|
|
2009-08-21 06:14:34 +00:00
|
|
|
lcl_FormatPostIt( rOptions.m_pPostItShell->GetDoc(), aPam,
|
2009-08-21 11:30:53 +00:00
|
|
|
rPostIt.GetPostIt(), bNewPage, bIsFirstPostIt, nVirtPg, nLineNo );
|
|
|
|
bIsFirstPostIt = false;
|
|
|
|
|
|
|
|
if (nPostItMode == POSTITS_ENDPAGE)
|
|
|
|
{
|
|
|
|
// get the correct number of current pages for the post-it document
|
|
|
|
rOptions.m_pPostItShell->CalcLayout();
|
|
|
|
const sal_Int32 nPages = rOptions.m_pPostItDoc->GetPageCount();
|
2009-08-25 13:10:30 +00:00
|
|
|
aPostItLastStartPageNum[ nPhyPageNum ] = nPages;
|
2009-08-21 11:30:53 +00:00
|
|
|
}
|
|
|
|
}
|
2009-08-21 06:14:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// format post-it doc to get correct number of pages
|
|
|
|
rOptions.m_pPostItShell->CalcLayout();
|
|
|
|
const sal_Int32 nPostItDocPageCount = rOptions.m_pPostItDoc->GetPageCount();
|
|
|
|
|
|
|
|
if (nPostItMode == POSTITS_ONLY || nPostItMode == POSTITS_ENDDOC)
|
|
|
|
{
|
2009-08-21 11:30:53 +00:00
|
|
|
// now add those post-it pages to the vector of pages to print
|
|
|
|
// or replace them if only post-its should be printed
|
|
|
|
|
2009-08-25 13:10:30 +00:00
|
|
|
rOptions.GetPostItStartFrames().clear();
|
2009-08-21 06:14:34 +00:00
|
|
|
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.
|
2009-08-25 13:10:30 +00:00
|
|
|
rOptions.GetPostItStartFrames().resize( rOptions.GetPagesToPrint().size() );
|
2009-08-21 06:14:34 +00:00
|
|
|
}
|
|
|
|
else if (nPostItMode == POSTITS_ONLY)
|
|
|
|
{
|
|
|
|
// no document page to be printed
|
|
|
|
rOptions.GetPagesToPrint().clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
// now we just need to add the post-it pages to be printed to the end
|
2009-08-25 13:10:30 +00:00
|
|
|
// of the vector of pages to print and keep the GetValidStartFrames
|
2009-08-21 06:14:34 +00:00
|
|
|
// data conform with it
|
|
|
|
sal_Int32 nPageNum = 0;
|
2009-08-21 11:30:53 +00:00
|
|
|
const SwPageFrm * pPageFrm = (SwPageFrm*)rOptions.m_pPostItShell->GetLayout()->Lower();
|
2009-08-21 06:14:34 +00:00
|
|
|
while( pPageFrm && nPageNum < nPostItDocPageCount )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" );
|
|
|
|
++nPageNum;
|
|
|
|
rOptions.GetPagesToPrint().push_back( 0 ); // a page number of 0 indicates this page is from the post-it doc
|
2009-08-25 13:10:30 +00:00
|
|
|
DBG_ASSERT( pPageFrm, "pPageFrm is NULL!" );
|
|
|
|
rOptions.GetPostItStartFrames().push_back( pPageFrm );
|
2009-08-21 06:14:34 +00:00
|
|
|
pPageFrm = (SwPageFrm*)pPageFrm->GetNext();
|
|
|
|
}
|
|
|
|
DBG_ASSERT( nPageNum == nPostItDocPageCount, "unexpected number of pages" );
|
|
|
|
}
|
2009-08-21 11:30:53 +00:00
|
|
|
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;
|
|
|
|
|
2009-08-21 13:32:05 +00:00
|
|
|
// ... thus, first collect all post-it doc start frames in a vector
|
2009-08-25 13:10:30 +00:00
|
|
|
sal_Int32 nPostItPageNum = 0;
|
2009-08-21 11:30:53 +00:00
|
|
|
std::vector< const SwPageFrm * > aAllPostItStartFrames;
|
|
|
|
const SwPageFrm * pPageFrm = (SwPageFrm*)rOptions.m_pPostItShell->GetLayout()->Lower();
|
2009-08-25 13:10:30 +00:00
|
|
|
while( pPageFrm && aAllPostItStartFrames.size() < nPostItDocPageCount )
|
2009-08-21 11:30:53 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" );
|
2009-08-25 13:10:30 +00:00
|
|
|
++nPostItPageNum;
|
2009-08-21 11:30:53 +00:00
|
|
|
aAllPostItStartFrames.push_back( pPageFrm );
|
2009-08-21 13:32:05 +00:00
|
|
|
pPageFrm = (SwPageFrm*)pPageFrm->GetNext();
|
2009-08-21 11:30:53 +00:00
|
|
|
}
|
2009-08-25 13:10:30 +00:00
|
|
|
DBG_ASSERT( aAllPostItStartFrames.size() == nPostItDocPageCount,
|
2009-08-21 11:30:53 +00:00
|
|
|
"unexpected number of frames; does not match number of pages" );
|
|
|
|
|
2009-08-21 13:32:05 +00:00
|
|
|
// get a map that holds all post-it frames to be printed for a
|
|
|
|
// given physical page from the document
|
2009-08-25 13:10:30 +00:00
|
|
|
sal_Int32 nLastStartPageNum = 0;
|
2009-08-21 11:30:53 +00:00
|
|
|
std::map< sal_Int32, sal_Int32 >::const_iterator aIt;
|
2009-08-25 13:10:30 +00:00
|
|
|
for (aIt = aPostItLastStartPageNum.begin(); aIt != aPostItLastStartPageNum.end(); ++aIt)
|
2009-08-21 11:30:53 +00:00
|
|
|
{
|
2009-08-25 13:10:30 +00:00
|
|
|
const sal_Int32 nFrames = aIt->second - nLastStartPageNum;
|
|
|
|
const sal_Int32 nFirstStartPageNum = aIt == aPostItLastStartPageNum.begin() ?
|
|
|
|
1 : aIt->second - nFrames + 1;
|
|
|
|
DBG_ASSERT( 1 <= nFirstStartPageNum && nFirstStartPageNum <= nPostItDocPageCount,
|
2009-08-21 13:32:05 +00:00
|
|
|
"page number for first frame out of range" );
|
2009-08-21 11:30:53 +00:00
|
|
|
std::vector< const SwPageFrm * > aStartFrames;
|
2009-08-21 13:32:05 +00:00
|
|
|
for (sal_Int32 i = 0; i < nFrames; ++i)
|
|
|
|
{
|
2009-08-25 13:10:30 +00:00
|
|
|
const sal_Int32 nIdx = nFirstStartPageNum - 1 + i; // -1 because lowest page num is 1
|
|
|
|
DBG_ASSERT( 0 <= nIdx && nIdx < aAllPostItStartFrames.size(),
|
2009-08-21 13:32:05 +00:00
|
|
|
"index out of range" );
|
|
|
|
aStartFrames.push_back( aAllPostItStartFrames[ nIdx ] );
|
|
|
|
}
|
|
|
|
aPhysPageToPostItFrames[ aIt->first /* phys page num */ ] = aStartFrames;
|
2009-08-25 13:10:30 +00:00
|
|
|
nLastStartPageNum = aIt->second;
|
2009-08-21 11:30:53 +00:00
|
|
|
}
|
2009-08-21 13:32:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
// 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
|
2009-08-25 13:10:30 +00:00
|
|
|
// GetValidStartFrames vector as well.
|
2009-08-21 13:32:05 +00:00
|
|
|
// 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 = rOptions.GetPagesToPrint().size();
|
|
|
|
for (size_t i = 0 ; i < nNum; ++i)
|
|
|
|
{
|
|
|
|
// add the physical page to print from the document
|
|
|
|
const sal_Int32 nPhysPage = rOptions.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
|
|
|
|
rOptions.GetPagesToPrint().swap( aTmpPagesToPrint );
|
2009-08-25 13:10:30 +00:00
|
|
|
rOptions.GetPostItStartFrames().swap( aTmpPostItStartFrames );
|
2009-08-21 11:30:53 +00:00
|
|
|
}
|
2009-08-21 06:14:34 +00:00
|
|
|
}
|
2009-07-16 14:39:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-08-07 14:42:45 +00:00
|
|
|
void SwDoc::CalculatePagePairsForProspectPrinting(
|
2009-08-14 13:56:56 +00:00
|
|
|
SwPrintUIOptions &rOptions,
|
2009-08-07 14:42:45 +00:00
|
|
|
sal_Int32 nDocPageCount )
|
|
|
|
{
|
2009-08-14 13:56:56 +00:00
|
|
|
std::set< sal_Int32 > &rValidPagesSet = rOptions.GetValidPagesSet();
|
2009-08-25 13:10:30 +00:00
|
|
|
std::map< sal_Int32, const SwPageFrm * > &rValidStartFrms = rOptions.GetValidStartFrames();
|
2009-08-14 13:56:56 +00:00
|
|
|
std::vector< std::pair< sal_Int32, sal_Int32 > > &rPagePairs = rOptions.GetPagePairsForProspectPrinting();
|
2009-08-07 14:42:45 +00:00
|
|
|
|
|
|
|
rPagePairs.clear();
|
|
|
|
rValidPagesSet.clear();
|
|
|
|
rValidStartFrms.clear();
|
|
|
|
|
2009-08-14 13:56:56 +00:00
|
|
|
rtl::OUString aPageRange = rOptions.getStringValue( "PageRange", rtl::OUString() );
|
2009-08-07 14:42:45 +00:00
|
|
|
StringRangeEnumerator aRange( aPageRange, 1, nDocPageCount, 0 );
|
|
|
|
|
|
|
|
DBG_ASSERT( pLayout, "no layout present" );
|
|
|
|
if (!pLayout || aRange.size() <= 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
const SwPageFrm *pStPage = (SwPageFrm*)pLayout->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 = (SwPageFrm*)pLayout->Lower();
|
|
|
|
while( pPageFrm && nPageNum < nDocPageCount )
|
|
|
|
{
|
2009-08-21 06:14:34 +00:00
|
|
|
DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" );
|
2009-08-07 14:42:45 +00:00
|
|
|
++nPageNum;
|
|
|
|
rValidPagesSet.insert( nPageNum );
|
|
|
|
rValidStartFrms[ nPageNum ] = pPageFrm;
|
|
|
|
pPageFrm = (SwPageFrm*)pPageFrm->GetNext();
|
|
|
|
}
|
|
|
|
DBG_ASSERT( nPageNum == nDocPageCount, "unexpected number of pages" );
|
|
|
|
|
|
|
|
// properties to take into account when calcualting the set of pages
|
2009-08-14 13:56:56 +00:00
|
|
|
// Note: here bPrintLeftPages and bPrintRightPages refer to the (virtual) resulting pages
|
2009-08-07 14:42:45 +00:00
|
|
|
// of the prospect!
|
2009-08-14 13:56:56 +00:00
|
|
|
bool bPrintLeftPages = rOptions.IsPrintLeftPages();
|
|
|
|
bool bPrintRightPages = rOptions.IsPrintRightPages();
|
2009-08-07 14:42:45 +00:00
|
|
|
// TLPDF, TODO: remove bPrintReverse, should be handled by PLs framework now
|
2009-08-14 13:56:56 +00:00
|
|
|
//TLPDF bool bPrintReverse = rOptions.getBoolValue( C2U( "PrintReverseOrder" ), false );
|
|
|
|
// TLPDF: this one seems not to be used in prospect printing: bool bPrintEmptyPages = rOptions.getBoolValue( C2U( "PrintEmptyPages" ), false );
|
2009-08-21 06:44:00 +00:00
|
|
|
bool bPrintProspect_RTL = rOptions.getIntValue( "PrintProspectRTL", 0 ) ? true : false;
|
2009-08-07 14:42:45 +00:00
|
|
|
|
|
|
|
// 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;
|
2009-08-11 08:25:58 +00:00
|
|
|
for ( i = 0; i < sal_Int32(aPagesToPrint.size()); ++i)
|
2009-08-07 14:42:45 +00:00
|
|
|
{
|
|
|
|
const sal_Int32 nPage = aPagesToPrint[i];
|
|
|
|
const SwPageFrm *pFrm = rValidStartFrms[ nPage ];
|
|
|
|
aVec.push_back( pFrm );
|
|
|
|
}
|
|
|
|
|
2009-08-10 12:19:26 +00:00
|
|
|
// just one page is special ...
|
|
|
|
if ( 1 == aVec.size() )
|
|
|
|
aVec.insert( aVec.begin() + 1, 0 ); // insert a second empty page
|
2009-08-07 14:42:45 +00:00
|
|
|
else
|
|
|
|
{
|
2009-08-10 12:19:26 +00:00
|
|
|
// 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)
|
2009-08-07 14:42:45 +00:00
|
|
|
while( aVec.size() & 3 )
|
|
|
|
aVec.push_back( 0 );
|
|
|
|
|
2009-08-10 12:19:26 +00:00
|
|
|
#ifdef TL_NOT_NOW /*TLPDF*/
|
2009-08-07 14:42:45 +00:00
|
|
|
if ( bPrintReverse && 4 < aVec.size() )
|
|
|
|
{
|
|
|
|
// das Array umsortieren
|
|
|
|
// Array: 1 2 3 4 5 6 7 8
|
|
|
|
// soll: 3 4 1 2 7 8 5 6
|
|
|
|
// Algorhitmus:
|
|
|
|
// vordere Haelfte: Austausch von 2 Pointer von Vorne vor die Haelfte
|
|
|
|
// hintere Haelfte: Austausch von 2 Pointer von der Haelfte nach hinten
|
|
|
|
|
|
|
|
USHORT nHalf = aVec.size() / 2;
|
|
|
|
USHORT nSwapCount = nHalf / 4;
|
|
|
|
|
|
|
|
const SwPageFrm ** ppArrStt = &aVec[ 0 ];
|
|
|
|
const SwPageFrm ** ppArrHalf = &aVec[ nHalf ];
|
|
|
|
|
|
|
|
for ( int k = 0; k < 2; ++k )
|
|
|
|
{
|
|
|
|
for ( USHORT n = 0; n < nSwapCount; ++n )
|
|
|
|
{
|
|
|
|
const SwPageFrm * pTmp = *ppArrStt;
|
|
|
|
*ppArrStt++ = *(ppArrHalf-2);
|
|
|
|
*(ppArrHalf-2) = pTmp;
|
|
|
|
|
|
|
|
pTmp = *ppArrStt;
|
|
|
|
*ppArrStt++ = *--ppArrHalf;
|
|
|
|
*ppArrHalf-- = pTmp;
|
|
|
|
}
|
|
|
|
ppArrStt = &aVec[ nHalf ];
|
|
|
|
ppArrHalf = &aVec[ 0 ] + aVec.size();
|
|
|
|
}
|
|
|
|
}
|
2009-08-10 12:19:26 +00:00
|
|
|
#endif // TL_NOT_NOW /*TLPDF*/
|
2009-08-07 14:42:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// dann sorge mal dafuer, das alle Seiten in der richtigen
|
|
|
|
// Reihenfolge stehen:
|
|
|
|
USHORT nSPg = 0, nEPg = aVec.size(), nStep = 1;
|
|
|
|
if ( 0 == (nEPg & 1 )) // ungerade gibt es nicht!
|
|
|
|
--nEPg;
|
|
|
|
|
2009-08-14 13:56:56 +00:00
|
|
|
if ( !bPrintLeftPages )
|
2009-08-07 14:42:45 +00:00
|
|
|
++nStep;
|
2009-08-14 13:56:56 +00:00
|
|
|
else if ( !bPrintRightPages )
|
2009-08-07 14:42:45 +00:00
|
|
|
{
|
|
|
|
++nStep;
|
|
|
|
++nSPg, --nEPg;
|
|
|
|
}
|
|
|
|
|
2009-08-10 12:19:26 +00:00
|
|
|
// the number of 'virtual' pages to be printed
|
2009-08-07 14:42:45 +00:00
|
|
|
sal_Int32 nCntPage = (( nEPg - nSPg ) / ( 2 * nStep )) + 1;
|
|
|
|
|
|
|
|
for ( USHORT nPrintCount = 0; nSPg < nEPg &&
|
|
|
|
nPrintCount < nCntPage; ++nPrintCount )
|
|
|
|
{
|
|
|
|
pStPage = aVec[ nSPg ];
|
|
|
|
const SwPageFrm* pNxtPage = nEPg < aVec.size() ? aVec[ nEPg ] : 0;
|
|
|
|
|
|
|
|
short nRtlOfs = bPrintProspect_RTL ? 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;
|
|
|
|
}
|
|
|
|
|
2009-08-10 14:52:25 +00:00
|
|
|
sal_Int32 nFirst = -1, nSecond = -1;
|
2009-08-07 14:42:45 +00:00
|
|
|
for ( int nC = 0; nC < 2; ++nC )
|
|
|
|
{
|
2009-08-11 08:25:58 +00:00
|
|
|
sal_Int32 nPage = -1;
|
2009-08-07 14:42:45 +00:00
|
|
|
if ( pStPage )
|
2009-08-11 08:25:58 +00:00
|
|
|
nPage = pStPage->GetPhyPageNum();
|
2009-08-07 14:42:45 +00:00
|
|
|
if (nC == 0)
|
2009-08-11 08:25:58 +00:00
|
|
|
nFirst = nPage;
|
2009-08-07 14:42:45 +00:00
|
|
|
else
|
2009-08-11 08:25:58 +00:00
|
|
|
nSecond = nPage;
|
2009-08-07 14:42:45 +00:00
|
|
|
|
|
|
|
pStPage = pNxtPage;
|
|
|
|
}
|
|
|
|
rPagePairs.push_back( std::pair< sal_Int32, sal_Int32 >(nFirst, nSecond) );
|
|
|
|
|
|
|
|
nSPg = nSPg + nStep;
|
|
|
|
nEPg = nEPg - nStep;
|
|
|
|
}
|
2009-08-07 15:49:37 +00:00
|
|
|
DBG_ASSERT( size_t(nCntPage) == rPagePairs.size(), "size mismatch for number of page pairs" );
|
2009-08-21 06:14:34 +00:00
|
|
|
|
|
|
|
// luckily prospect printing does not make use of post-its so far,
|
|
|
|
// thus we are done here.
|
2009-08-07 14:42:45 +00:00
|
|
|
}
|
2009-07-16 14:39:49 +00:00
|
|
|
|
|
|
|
|
2002-09-02 11:24:49 +00:00
|
|
|
sal_uInt16 SwDoc::GetPageCount() const
|
|
|
|
{
|
|
|
|
return GetRootFrm() ? GetRootFrm()->GetPageNum() : 0;
|
|
|
|
}
|
|
|
|
|
2005-03-08 12:43:06 +00:00
|
|
|
const Size SwDoc::GetPageSize( sal_uInt16 nPageNum, bool bSkipEmptyPages ) const
|
2002-09-02 11:24:49 +00:00
|
|
|
{
|
|
|
|
Size aSize;
|
|
|
|
if( GetRootFrm() && nPageNum )
|
|
|
|
{
|
|
|
|
const SwPageFrm* pPage = static_cast<const SwPageFrm*>
|
|
|
|
(GetRootFrm()->Lower());
|
2005-03-08 12:43:06 +00:00
|
|
|
|
2002-09-02 11:24:49 +00:00
|
|
|
while( --nPageNum && pPage->GetNext() )
|
|
|
|
pPage = static_cast<const SwPageFrm*>( pPage->GetNext() );
|
2005-03-08 12:43:06 +00:00
|
|
|
|
|
|
|
if( !bSkipEmptyPages && pPage->IsEmptyPage() && pPage->GetNext() )
|
2002-09-09 11:11:22 +00:00
|
|
|
pPage = static_cast<const SwPageFrm*>( pPage->GetNext() );
|
2005-03-08 12:43:06 +00:00
|
|
|
|
2002-09-02 11:24:49 +00:00
|
|
|
aSize = pPage->Frm().SSize();
|
|
|
|
}
|
|
|
|
return aSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* void UpdateDocStat( const SwDocStat& rStat );
|
|
|
|
*************************************************************************/
|
|
|
|
|
2002-08-13 06:09:29 +00:00
|
|
|
void SwDoc::UpdateDocStat( SwDocStat& rStat )
|
2002-08-12 07:36:16 +00:00
|
|
|
{
|
|
|
|
if( rStat.bModified )
|
|
|
|
{
|
|
|
|
rStat.Reset();
|
|
|
|
rStat.nPara = 0; // Default ist auf 1 !!
|
|
|
|
SwNode* pNd;
|
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
for( ULONG i = GetNodes().Count(); i; )
|
|
|
|
{
|
|
|
|
switch( ( pNd = GetNodes()[ --i ])->GetNodeType() )
|
2002-08-12 07:36:16 +00:00
|
|
|
{
|
|
|
|
case ND_TEXTNODE:
|
2004-04-27 12:41:45 +00:00
|
|
|
((SwTxtNode*)pNd)->CountWords( rStat, 0, ((SwTxtNode*)pNd)->GetTxt().Len() );
|
2002-08-12 07:36:16 +00:00
|
|
|
break;
|
|
|
|
case ND_TABLENODE: ++rStat.nTbl; break;
|
|
|
|
case ND_GRFNODE: ++rStat.nGrf; break;
|
|
|
|
case ND_OLENODE: ++rStat.nOLE; break;
|
|
|
|
case ND_SECTIONNODE: break;
|
|
|
|
}
|
2007-09-27 07:32:40 +00:00
|
|
|
}
|
2002-08-12 07:36:16 +00:00
|
|
|
|
2000-11-20 13:47:36 +00:00
|
|
|
rStat.nPage = GetRootFrm() ? GetRootFrm()->GetPageNum() : 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
rStat.bModified = FALSE;
|
|
|
|
SetDocStat( rStat );
|
2007-07-17 12:05:50 +00:00
|
|
|
|
|
|
|
com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aStat( rStat.nPage ? 7 : 6);
|
|
|
|
sal_Int32 n=0;
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("TableCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nTbl;
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("ImageCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nGrf;
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("ObjectCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nOLE;
|
|
|
|
if ( rStat.nPage )
|
|
|
|
{
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("PageCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nPage;
|
|
|
|
}
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("ParagraphCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nPara;
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("WordCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nWord;
|
|
|
|
aStat[n].Name = ::rtl::OUString::createFromAscii("CharacterCount");
|
|
|
|
aStat[n++].Value <<= (sal_Int32)rStat.nChar;
|
|
|
|
|
2007-08-03 09:59:51 +00:00
|
|
|
// For e.g. autotext documents there is no pSwgInfo (#i79945)
|
2008-02-26 13:04:30 +00:00
|
|
|
if (GetDocShell()) {
|
|
|
|
uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
|
|
|
|
GetDocShell()->GetModel(), uno::UNO_QUERY_THROW);
|
|
|
|
uno::Reference<document::XDocumentProperties> xDocProps(
|
|
|
|
xDPS->getDocumentProperties());
|
|
|
|
xDocProps->setDocumentStatistics(aStat);
|
2007-08-03 09:59:51 +00:00
|
|
|
}
|
2007-07-17 12:05:50 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
// event. Stat. Felder Updaten
|
|
|
|
SwFieldType *pType = GetSysFldType(RES_DOCSTATFLD);
|
|
|
|
pType->UpdateFlds();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-08-12 07:36:16 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
// Dokument - Info
|
|
|
|
|
2008-02-26 13:04:30 +00:00
|
|
|
void SwDoc::DocInfoChgd( )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
USHORT nMaxItems = GetAttrPool().GetItemCount( RES_TXTATR_REFMARK );
|
|
|
|
for( USHORT n = 0; n < nMaxItems; ++n )
|
|
|
|
{
|
|
|
|
if( 0 == (pItem = GetAttrPool().GetItem( 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( USHORT nIndex ) const
|
|
|
|
{
|
|
|
|
const SfxPoolItem* pItem;
|
|
|
|
const SwTxtRefMark* pTxtRef;
|
|
|
|
const SwFmtRefMark* pRet = 0;
|
|
|
|
|
|
|
|
USHORT nMaxItems = GetAttrPool().GetItemCount( RES_TXTATR_REFMARK );
|
|
|
|
USHORT nCount = 0;
|
|
|
|
for( USHORT n = 0; n < nMaxItems; ++n )
|
|
|
|
if( 0 != (pItem = GetAttrPool().GetItem( 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
|
|
|
|
USHORT SwDoc::GetRefMarks( SvStringsDtor* pNames ) const
|
|
|
|
{
|
|
|
|
const SfxPoolItem* pItem;
|
|
|
|
const SwTxtRefMark* pTxtRef;
|
|
|
|
|
|
|
|
USHORT nMaxItems = GetAttrPool().GetItemCount( RES_TXTATR_REFMARK );
|
|
|
|
USHORT nCount = 0;
|
|
|
|
for( USHORT n = 0; n < nMaxItems; ++n )
|
|
|
|
if( 0 != (pItem = GetAttrPool().GetItem( 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;
|
|
|
|
}
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwDoc::SetModified()
|
|
|
|
{
|
2005-10-19 11:34:26 +00:00
|
|
|
// --> OD 2005-08-29 #125370#
|
|
|
|
SwLayouter::ClearMovedFwdFrms( *this );
|
|
|
|
SwLayouter::ClearObjsTmpConsiderWrapInfluence( *this );
|
|
|
|
SwLayouter::ClearFrmsNotToWrap( *this );
|
|
|
|
// <--
|
2006-06-02 11:10:50 +00:00
|
|
|
// --> OD 2006-05-10 #i65250#
|
|
|
|
SwLayouter::ClearMoveBwdLayoutInfo( *this );
|
|
|
|
// <--
|
2000-09-18 23:08:29 +00:00
|
|
|
// dem Link wird der Status returnt, wie die Flags waren und werden
|
|
|
|
// Bit 0: -> alter Zustand
|
|
|
|
// Bit 1: -> neuer Zustand
|
2006-08-14 14:54:56 +00:00
|
|
|
long nCall = mbModified ? 3 : 2;
|
|
|
|
mbModified = TRUE;
|
2000-09-18 23:08:29 +00:00
|
|
|
pDocStat->bModified = TRUE;
|
|
|
|
if( aOle2Link.IsSet() )
|
|
|
|
{
|
2006-08-14 14:54:56 +00:00
|
|
|
mbInCallModified = TRUE;
|
2000-09-18 23:08:29 +00:00
|
|
|
aOle2Link.Call( (void*)nCall );
|
2006-08-14 14:54:56 +00:00
|
|
|
mbInCallModified = FALSE;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2006-08-14 14:54:56 +00:00
|
|
|
long nCall = mbModified ? 1 : 0;
|
|
|
|
mbModified = FALSE;
|
2006-11-06 13:41:31 +00:00
|
|
|
// If there is already a document statistic, we assume that
|
|
|
|
// it is correct. In this case we reset the modified flag.
|
|
|
|
if ( 0 != pDocStat->nChar )
|
|
|
|
pDocStat->bModified = FALSE;
|
2000-09-18 23:08:29 +00:00
|
|
|
nUndoSavePos = nUndoPos;
|
|
|
|
if( nCall && aOle2Link.IsSet() )
|
|
|
|
{
|
2006-08-14 14:54:56 +00:00
|
|
|
mbInCallModified = TRUE;
|
2000-09-18 23:08:29 +00:00
|
|
|
aOle2Link.Call( (void*)nCall );
|
2006-08-14 14:54:56 +00:00
|
|
|
mbInCallModified = FALSE;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SwDoc::ReRead( SwPaM& rPam, const String& rGrfName,
|
2000-11-28 19:40:08 +00:00
|
|
|
const String& rFltName, const Graphic* pGraphic,
|
|
|
|
const GraphicObject* pGrafObj )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwGrfNode *pGrfNd;
|
|
|
|
if( ( !rPam.HasMark()
|
|
|
|
|| rPam.GetPoint()->nNode.GetIndex() == rPam.GetMark()->nNode.GetIndex() )
|
|
|
|
&& 0 != ( pGrfNd = rPam.GetPoint()->nNode.GetNode().GetGrfNode() ) )
|
|
|
|
{
|
|
|
|
if( DoesUndo() )
|
|
|
|
{
|
|
|
|
ClearRedo();
|
|
|
|
AppendUndo( new SwUndoReRead( rPam, *pGrfNd ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Weil nicht bekannt ist, ob sich die Grafik spiegeln laesst,
|
|
|
|
// immer das SpiegelungsAttribut zuruecksetzen
|
2007-09-27 07:32:40 +00:00
|
|
|
if( RES_MIRROR_GRAPH_DONT != pGrfNd->GetSwAttrSet().
|
2000-09-18 23:08:29 +00:00
|
|
|
GetMirrorGrf().GetValue() )
|
|
|
|
pGrfNd->SetAttr( SwMirrorGrf() );
|
|
|
|
|
2000-11-28 19:40:08 +00:00
|
|
|
pGrfNd->ReRead( rGrfName, rFltName, pGraphic, pGrafObj, TRUE );
|
2000-09-18 23:08:29 +00:00
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-02-26 08:45:06 +00:00
|
|
|
BOOL lcl_SpellAndGrammarAgain( const SwNodePtr& rpNd, void* pArgs )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwTxtNode *pTxtNode = (SwTxtNode*)rpNd->GetTxtNode();
|
|
|
|
BOOL bOnlyWrong = *(BOOL*)pArgs;
|
|
|
|
if( pTxtNode )
|
|
|
|
{
|
|
|
|
if( bOnlyWrong )
|
|
|
|
{
|
|
|
|
if( pTxtNode->GetWrong() &&
|
|
|
|
pTxtNode->GetWrong()->InvalidateWrong() )
|
2007-01-02 15:46:34 +00:00
|
|
|
pTxtNode->SetWrongDirty( true );
|
2008-02-26 08:45:06 +00:00
|
|
|
if( pTxtNode->GetGrammarCheck() &&
|
|
|
|
pTxtNode->GetGrammarCheck()->InvalidateWrong() )
|
|
|
|
pTxtNode->SetGrammarCheckDirty( true );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-01-02 15:46:34 +00:00
|
|
|
pTxtNode->SetWrongDirty( true );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pTxtNode->GetWrong() )
|
|
|
|
pTxtNode->GetWrong()->SetInvalid( 0, STRING_LEN );
|
2008-02-26 08:45:06 +00:00
|
|
|
pTxtNode->SetGrammarCheckDirty( true );
|
|
|
|
if( pTxtNode->GetGrammarCheck() )
|
|
|
|
pTxtNode->GetGrammarCheck()->SetInvalid( 0, STRING_LEN );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2007-06-27 12:17:58 +00:00
|
|
|
BOOL lcl_CheckSmartTagsAgain( const SwNodePtr& rpNd, void* )
|
|
|
|
{
|
|
|
|
SwTxtNode *pTxtNode = (SwTxtNode*)rpNd->GetTxtNode();
|
|
|
|
// BOOL bOnlyWrong = *(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 TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* SwDoc::SpellItAgainSam( BOOL bInvalid, BOOL bOnlyWrong )
|
|
|
|
*
|
|
|
|
* stoesst das Spelling im Idle-Handler wieder an.
|
|
|
|
* Wird bInvalid als 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.
|
|
|
|
************************************************************************/
|
|
|
|
|
2007-06-27 12:17:58 +00:00
|
|
|
void SwDoc::SpellItAgainSam( BOOL bInvalid, BOOL bOnlyWrong, BOOL bSmartTags )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
ASSERT( GetRootFrm(), "SpellAgain: Where's my RootFrm?" );
|
|
|
|
if( bInvalid )
|
|
|
|
{
|
|
|
|
SwPageFrm *pPage = (SwPageFrm*)GetRootFrm()->Lower();
|
|
|
|
while ( pPage )
|
|
|
|
{
|
2007-06-27 12:17:58 +00:00
|
|
|
if ( bSmartTags )
|
|
|
|
pPage->InvalidateSmartTags();
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
pPage->InvalidateSpelling();
|
|
|
|
pPage = (SwPageFrm*)pPage->GetNext();
|
|
|
|
}
|
2008-07-16 12:25:02 +00:00
|
|
|
GetRootFrm()->SetNeedGrammarCheck( true );
|
2007-06-27 12:17:58 +00:00
|
|
|
|
|
|
|
if ( bSmartTags )
|
|
|
|
GetNodes().ForEach( lcl_CheckSmartTagsAgain, &bOnlyWrong );
|
|
|
|
|
2008-02-26 08:45:06 +00:00
|
|
|
GetNodes().ForEach( lcl_SpellAndGrammarAgain, &bOnlyWrong );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2007-06-27 12:17:58 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
GetRootFrm()->SetIdleFlags();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::InvalidateAutoCompleteFlag()
|
|
|
|
{
|
|
|
|
if( GetRootFrm() )
|
|
|
|
{
|
|
|
|
SwPageFrm *pPage = (SwPageFrm*)GetRootFrm()->Lower();
|
|
|
|
while ( pPage )
|
|
|
|
{
|
|
|
|
pPage->InvalidateAutoCompleteWords();
|
|
|
|
pPage = (SwPageFrm*)pPage->GetNext();
|
|
|
|
}
|
|
|
|
for( ULONG nNd = 1, nCnt = GetNodes().Count(); nNd < nCnt; ++nNd )
|
2006-07-10 14:27:01 +00:00
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNode = GetNodes()[ nNd ]->GetTxtNode();
|
|
|
|
if ( pTxtNode ) pTxtNode->SetAutoCompleteWordDirty( true );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
GetRootFrm()->SetIdleFlags();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const SwFmtINetFmt* SwDoc::FindINetAttr( const String& rName ) const
|
|
|
|
{
|
|
|
|
const SwFmtINetFmt* pItem;
|
|
|
|
const SwTxtINetFmt* pTxtAttr;
|
|
|
|
const SwTxtNode* pTxtNd;
|
|
|
|
USHORT n, nMaxItems = GetAttrPool().GetItemCount( RES_TXTATR_INETFMT );
|
|
|
|
for( n = 0; n < nMaxItems; ++n )
|
|
|
|
if( 0 != (pItem = (SwFmtINetFmt*)GetAttrPool().GetItem(
|
|
|
|
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, BYTE nLevel, BYTE nPara, BOOL bImpress )
|
|
|
|
{
|
|
|
|
const SwOutlineNodes& rOutNds = GetNodes().GetOutLineNds();
|
|
|
|
if( pExtDoc && rOutNds.Count() )
|
|
|
|
{
|
|
|
|
USHORT 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() );
|
2009-01-07 11:57:24 +00:00
|
|
|
const ULONG nIndex = rOutNds[ i ]->GetIndex();
|
|
|
|
//BYTE nLvl = ((SwTxtNode*)GetNodes()[ nIndex ])->GetTxtColl()//#outline level,zhaojianwei
|
|
|
|
// ->GetOutlineLevel();
|
|
|
|
const int nLvl = ((SwTxtNode*)GetNodes()[ nIndex ])->GetAttrOutlineLevel()-1;//<-end,zhaojianwei
|
2000-09-18 23:08:29 +00:00
|
|
|
if( nLvl > nLevel )
|
|
|
|
continue;
|
|
|
|
USHORT nEndOfs = 1;
|
|
|
|
BYTE nWish = nPara;
|
|
|
|
ULONG nNextOutNd = i + 1 < rOutNds.Count() ?
|
|
|
|
rOutNds[ i + 1 ]->GetIndex() : GetNodes().Count();
|
|
|
|
BOOL bKeep = 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 )
|
2008-06-13 08:32:12 +00:00
|
|
|
(*pColl)[ i ]->ResetFmtAttr( RES_PAGEDESC, RES_BREAK );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwNodeIndex aIndx( pExtDoc->GetNodes().GetEndOfExtras() );
|
|
|
|
++aEndOfDoc;
|
|
|
|
while( aIndx < aEndOfDoc )
|
|
|
|
{
|
|
|
|
SwNode *pNode;
|
|
|
|
BOOL bDelete = FALSE;
|
|
|
|
if( (pNode = &aIndx.GetNode())->IsTxtNode() )
|
|
|
|
{
|
|
|
|
SwTxtNode *pNd = (SwTxtNode*)pNode;
|
|
|
|
if( pNd->HasSwAttrSet() )
|
|
|
|
pNd->ResetAttr( RES_PAGEDESC, RES_BREAK );
|
|
|
|
if( bImpress )
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
SwTxtFmtColl* pMyColl = pNd->GetTxtColl();
|
2009-01-07 11:57:24 +00:00
|
|
|
//USHORT nHeadLine = static_cast<USHORT>(pMyColl->GetOutlineLevel()==NO_NUMBERING ?//#outlinelevel,zhaojianwei
|
|
|
|
const USHORT nHeadLine = static_cast<USHORT>(
|
|
|
|
!pMyColl->IsAssignedToListLevelOfOutlineStyle() //<-end,zhaojianwei
|
|
|
|
? RES_POOLCOLL_HEADLINE2
|
|
|
|
: RES_POOLCOLL_HEADLINE1 );
|
2007-09-27 07:32:40 +00:00
|
|
|
pMyColl = pExtDoc->GetTxtCollFromPool( nHeadLine );
|
|
|
|
pNd->ChgFmtColl( pMyColl );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if( !pNd->Len() &&
|
|
|
|
pNd->StartOfSectionIndex()+2 < pNd->EndOfSectionIndex() )
|
|
|
|
{
|
|
|
|
bDelete = 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()
|
|
|
|
{
|
|
|
|
BOOL bRet = FALSE;
|
2007-09-27 07:32:40 +00:00
|
|
|
StartUndo( UNDO_UI_DELETE_INVISIBLECNTNT, NULL );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd;
|
|
|
|
SwClientIter aIter( *GetSysFldType( RES_HIDDENPARAFLD ) );
|
|
|
|
for( SwFmtFld* pFmtFld = (SwFmtFld*)aIter.First( TYPE( SwFmtFld ));
|
|
|
|
pFmtFld; pFmtFld = (SwFmtFld*)aIter.Next() )
|
2006-11-01 14:10:05 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pFmtFld->GetTxtFld() &&
|
|
|
|
0 != ( pTxtNd = (SwTxtNode*)pFmtFld->GetTxtFld()->GetpTxtNode() ) &&
|
2004-02-26 14:26:20 +00:00
|
|
|
pTxtNd->GetpSwpHints() && pTxtNd->HasHiddenParaField() &&
|
2000-09-18 23:08:29 +00:00
|
|
|
&pTxtNd->GetNodes() == &GetNodes() )
|
|
|
|
{
|
|
|
|
bRet = TRUE;
|
|
|
|
SwPaM aPam( *pTxtNd, 0, *pTxtNd, pTxtNd->GetTxt().Len() );
|
|
|
|
|
2006-11-01 14:10:05 +00:00
|
|
|
// 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() ) )
|
|
|
|
{
|
|
|
|
Delete( aPam );
|
|
|
|
}
|
|
|
|
else
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
aPam.DeleteMark();
|
|
|
|
DelFullPara( aPam );
|
|
|
|
}
|
|
|
|
}
|
2006-11-01 14:10:05 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2004-06-29 07:08:09 +00:00
|
|
|
//
|
|
|
|
// Remove any hidden paragraph (hidden text attribute)
|
|
|
|
//
|
|
|
|
for( ULONG n = GetNodes().Count(); n; )
|
|
|
|
{
|
|
|
|
SwTxtNode* pTxtNd = GetNodes()[ --n ]->GetTxtNode();
|
|
|
|
if ( pTxtNd )
|
|
|
|
{
|
2006-02-06 16:18:49 +00:00
|
|
|
bool bRemoved = false;
|
|
|
|
SwPaM aPam( *pTxtNd, 0, *pTxtNd, pTxtNd->GetTxt().Len() );
|
2004-06-29 07:08:09 +00:00
|
|
|
if ( pTxtNd->HasHiddenCharAttribute( true ) )
|
|
|
|
{
|
2006-02-06 16:18:49 +00:00
|
|
|
bRemoved = TRUE;
|
2004-06-29 07:08:09 +00:00
|
|
|
bRet = TRUE;
|
2006-11-01 14:10:05 +00:00
|
|
|
|
|
|
|
// 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() ) )
|
|
|
|
{
|
|
|
|
Delete( aPam );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aPam.DeleteMark();
|
|
|
|
DelFullPara( aPam );
|
|
|
|
}
|
2004-06-29 07:08:09 +00:00
|
|
|
}
|
|
|
|
else if ( pTxtNd->HasHiddenCharAttribute( false ) )
|
|
|
|
{
|
2006-02-06 16:18:49 +00:00
|
|
|
bRemoved = TRUE;
|
|
|
|
bRet = TRUE;
|
2006-11-01 14:10:05 +00:00
|
|
|
SwScriptInfo::DeleteHiddenRanges( *pTxtNd );
|
2004-06-29 07:08:09 +00:00
|
|
|
}
|
2006-02-06 16:18:49 +00:00
|
|
|
|
|
|
|
// --> FME 2006-01-11 #120473#
|
|
|
|
// Footnotes/Frames may have been removed, therefore we have
|
|
|
|
// to reset n:
|
|
|
|
if ( bRemoved )
|
|
|
|
n = aPam.GetPoint()->nNode.GetIndex();
|
|
|
|
// <--
|
2004-06-29 07:08:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
// dann noch alle versteckten Bereiche loeschen/leeren
|
|
|
|
SwSectionFmts aSectFmts;
|
|
|
|
SwSectionFmts& rSectFmts = GetSections();
|
2003-12-01 15:33:33 +00:00
|
|
|
USHORT n;
|
|
|
|
|
|
|
|
for( n = rSectFmts.Count(); n; )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwSectionFmt* pSectFmt = rSectFmts[ --n ];
|
2005-01-05 14:59:33 +00:00
|
|
|
// don't add sections in Undo/Redo
|
|
|
|
if( !pSectFmt->IsInNodesArr())
|
|
|
|
continue;
|
2000-09-18 23:08:29 +00:00
|
|
|
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() )
|
|
|
|
{
|
|
|
|
SwSection aSect( pSect->GetType(), pSect->GetName() );
|
|
|
|
aSect = *pSect;
|
|
|
|
aSect.SetCondition( aEmptyStr );
|
|
|
|
aSect.SetHidden( FALSE );
|
|
|
|
ChgSection( n, aSect );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( 0 != ( n = aSectFmts.Count() ))
|
|
|
|
{
|
|
|
|
while( n )
|
|
|
|
{
|
|
|
|
SwSectionFmt* pSectFmt = aSectFmts[ --n ];
|
|
|
|
SwSectionNode* pSectNd = pSectFmt->GetSectionNode();
|
|
|
|
if( pSectNd )
|
|
|
|
{
|
|
|
|
bRet = TRUE;
|
|
|
|
SwPaM aPam( *pSectNd );
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
if( pSectNd->StartOfSectionNode()->StartOfSectionIndex() ==
|
2000-09-18 23:08:29 +00:00
|
|
|
pSectNd->GetIndex() - 1 &&
|
2006-08-14 14:54:56 +00:00
|
|
|
pSectNd->StartOfSectionNode()->EndOfSectionIndex() ==
|
2000-09-18 23:08:29 +00:00
|
|
|
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() );
|
|
|
|
|
|
|
|
Delete( aPam );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// die gesamte Section loeschen
|
|
|
|
aPam.SetMark();
|
|
|
|
aPam.GetPoint()->nNode = *pSectNd->EndOfSectionNode();
|
|
|
|
DelFullPara( aPam );
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
aSectFmts.Remove( 0, aSectFmts.Count() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bRet )
|
|
|
|
SetModified();
|
2007-09-27 07:32:40 +00:00
|
|
|
EndUndo( UNDO_UI_DELETE_INVISIBLECNTNT, NULL );
|
2000-09-18 23:08:29 +00:00
|
|
|
return bRet;
|
2004-09-20 12:51:02 +00:00
|
|
|
}
|
|
|
|
/*-- 11.06.2004 08:34:04---------------------------------------------------
|
|
|
|
|
|
|
|
-----------------------------------------------------------------------*/
|
|
|
|
BOOL SwDoc::ConvertFieldsToText()
|
|
|
|
{
|
|
|
|
BOOL bRet = FALSE;
|
2008-08-27 11:54:11 +00:00
|
|
|
LockExpFlds();
|
2007-09-27 07:32:40 +00:00
|
|
|
StartUndo( UNDO_UI_REPLACE, NULL );
|
2004-09-20 12:51:02 +00:00
|
|
|
|
2007-09-27 07:32:40 +00:00
|
|
|
const SwFldTypes* pMyFldTypes = GetFldTypes();
|
|
|
|
sal_uInt16 nCount = pMyFldTypes->Count();
|
2004-09-20 12:51:02 +00:00
|
|
|
//go backward, field types are removed
|
|
|
|
for(sal_uInt16 nType = nCount; nType > 0; --nType)
|
|
|
|
{
|
2007-09-27 07:32:40 +00:00
|
|
|
const SwFieldType *pCurType = pMyFldTypes->GetObject(nType - 1);
|
2005-03-08 12:43:06 +00:00
|
|
|
|
|
|
|
if ( RES_POSTITFLD == pCurType->Which() )
|
|
|
|
continue;
|
|
|
|
|
2004-09-20 12:51:02 +00:00
|
|
|
SwClientIter aIter( *(SwFieldType*)pCurType );
|
|
|
|
const SwFmtFld* pCurFldFmt = (SwFmtFld*)aIter.First( TYPE( SwFmtFld ));
|
|
|
|
::std::vector<const SwFmtFld*> aFieldFmts;
|
|
|
|
while (pCurFldFmt)
|
|
|
|
{
|
|
|
|
aFieldFmts.push_back(pCurFldFmt);
|
|
|
|
pCurFldFmt = (SwFmtFld*)aIter.Next();
|
|
|
|
}
|
|
|
|
::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
|
2005-11-10 14:56:26 +00:00
|
|
|
|
2004-09-20 12:51:02 +00:00
|
|
|
BOOL bSkip = !pTxtFld ||
|
2005-11-10 14:56:26 +00:00
|
|
|
!pTxtFld->GetpTxtNode()->GetNodes().IsDocNodes();
|
2004-09-20 12:51:02 +00:00
|
|
|
|
|
|
|
if (!bSkip)
|
|
|
|
{
|
2005-11-10 14:56:26 +00:00
|
|
|
BOOL bInHeaderFooter = IsInHeaderFooter(SwNodeIndex(*pTxtFld->GetpTxtNode()));
|
2004-09-20 12:51:02 +00:00
|
|
|
const SwFmtFld& rFmtFld = pTxtFld->GetFld();
|
|
|
|
const SwField* pField = rFmtFld.GetFld();
|
2006-08-14 14:54:56 +00:00
|
|
|
|
2005-11-10 14:56:26 +00:00
|
|
|
//#i55595# some fields have to be excluded in headers/footers
|
|
|
|
USHORT 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->GetCntnt();
|
|
|
|
//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
|
2009-08-25 13:10:30 +00:00
|
|
|
SwPaM aPam(*pTxtFld->GetpTxtNode(), *pTxtFld->GetStart());
|
|
|
|
aPam.SetMark();
|
|
|
|
aPam.Move();
|
|
|
|
DeleteAndJoin(aPam);
|
|
|
|
Insert( aPam, sText, true );
|
2005-11-10 14:56:26 +00:00
|
|
|
}
|
2004-09-20 12:51:02 +00:00
|
|
|
}
|
|
|
|
++aBegin;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bRet )
|
|
|
|
SetModified();
|
2007-09-27 07:32:40 +00:00
|
|
|
EndUndo( UNDO_UI_REPLACE, NULL );
|
2008-08-27 11:54:11 +00:00
|
|
|
UnlockExpFlds();
|
2004-09-20 12:51:02 +00:00
|
|
|
return bRet;
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
bool SwDoc::IsVisibleLinks() const
|
|
|
|
{
|
|
|
|
return mbVisibleLinks;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::SetVisibleLinks(bool bFlag)
|
|
|
|
{
|
|
|
|
mbVisibleLinks = bFlag;
|
|
|
|
}
|
|
|
|
|
|
|
|
SvxLinkManager& SwDoc::GetLinkManager()
|
|
|
|
{
|
|
|
|
return *pLinkMgr;
|
|
|
|
}
|
|
|
|
|
|
|
|
const SvxLinkManager& SwDoc::GetLinkManager() const
|
|
|
|
{
|
|
|
|
return *pLinkMgr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwDoc::SetLinksUpdated(const bool bNewLinksUpdated)
|
|
|
|
{
|
|
|
|
mbLinksUpdated = bNewLinksUpdated;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SwDoc::LinksUpdated() const
|
|
|
|
{
|
|
|
|
return mbLinksUpdated;
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
// embedded alle lokalen Links (Bereiche/Grafiken)
|
2006-08-14 14:54:56 +00:00
|
|
|
bool SwDoc::EmbedAllLinks()
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
BOOL bRet = FALSE;
|
|
|
|
SvxLinkManager& rLnkMgr = GetLinkManager();
|
2004-10-04 18:02:05 +00:00
|
|
|
const ::sfx2::SvBaseLinks& rLnks = rLnkMgr.GetLinks();
|
2000-09-18 23:08:29 +00:00
|
|
|
if( rLnks.Count() )
|
|
|
|
{
|
|
|
|
BOOL bDoesUndo = DoesUndo();
|
|
|
|
DoUndo( FALSE );
|
|
|
|
|
|
|
|
for( USHORT n = 0; n < rLnks.Count(); ++n )
|
|
|
|
{
|
2004-10-04 18:02:05 +00:00
|
|
|
::sfx2::SvBaseLink* pLnk = &(*rLnks[ n ]);
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pLnk &&
|
|
|
|
( OBJECT_CLIENT_GRF == pLnk->GetObjType() ||
|
|
|
|
OBJECT_CLIENT_FILE == pLnk->GetObjType() ) &&
|
|
|
|
pLnk->ISA( SwBaseLink ) )
|
|
|
|
{
|
2004-10-04 18:02:05 +00:00
|
|
|
::sfx2::SvBaseLinkRef xLink = pLnk;
|
2000-09-18 23:08:29 +00:00
|
|
|
USHORT nCount = rLnks.Count();
|
|
|
|
|
|
|
|
String sFName;
|
2001-03-08 20:28:23 +00:00
|
|
|
rLnkMgr.GetDisplayNames( xLink, 0, &sFName, 0, 0 );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
INetURLObject aURL( sFName );
|
|
|
|
if( INET_PROT_FILE == aURL.GetProtocol() ||
|
|
|
|
INET_PROT_CID == aURL.GetProtocol() )
|
|
|
|
{
|
|
|
|
// dem Link sagen, das er aufgeloest wird!
|
2001-03-08 20:28:23 +00:00
|
|
|
xLink->Closed();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
// falls einer vergessen hat sich auszutragen
|
|
|
|
if( xLink.Is() )
|
2001-03-08 20:28:23 +00:00
|
|
|
rLnkMgr.Remove( xLink );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( nCount != rLnks.Count() + 1 )
|
|
|
|
n = 0; // wieder von vorne anfangen, es wurden
|
|
|
|
// mehrere Links entfernt
|
|
|
|
bRet = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DelAllUndoObj();
|
|
|
|
DoUndo( bDoesUndo );
|
|
|
|
SetModified();
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
|
|
Beschreibung:
|
|
|
|
--------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
BOOL SwDoc::IsInsTblFormatNum() const
|
|
|
|
{
|
2006-08-14 14:54:56 +00:00
|
|
|
return SW_MOD()->IsInsTblFormatNum(get(IDocumentSettingAccess::HTML_MODE));
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL SwDoc::IsInsTblChangeNumFormat() const
|
|
|
|
{
|
2006-08-14 14:54:56 +00:00
|
|
|
return SW_MOD()->IsInsTblChangeNumFormat(get(IDocumentSettingAccess::HTML_MODE));
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
|
|
Beschreibung:
|
|
|
|
--------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
BOOL SwDoc::IsInsTblAlignNum() const
|
|
|
|
{
|
2006-08-14 14:54:56 +00:00
|
|
|
return SW_MOD()->IsInsTblAlignNum(get(IDocumentSettingAccess::HTML_MODE));
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2001-02-08 13:32:55 +00:00
|
|
|
// setze das InsertDB als Tabelle Undo auf:
|
|
|
|
void SwDoc::AppendUndoForInsertFromDB( const SwPaM& rPam, BOOL bIsTable )
|
|
|
|
{
|
|
|
|
if( bIsTable )
|
|
|
|
{
|
|
|
|
const SwTableNode* pTblNd = rPam.GetPoint()->nNode.GetNode().FindTableNode();
|
|
|
|
if( pTblNd )
|
|
|
|
{
|
|
|
|
SwUndoCpyTbl* pUndo = new SwUndoCpyTbl;
|
|
|
|
pUndo->SetTableSttIdx( pTblNd->GetIndex() );
|
|
|
|
AppendUndo( pUndo );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( rPam.HasMark() )
|
|
|
|
{
|
|
|
|
SwUndoCpyDoc* pUndo = new SwUndoCpyDoc( rPam );
|
|
|
|
pUndo->SetInsertRange( rPam, FALSE );
|
|
|
|
AppendUndo( pUndo );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-05-18 13:01:12 +00:00
|
|
|
void SwDoc::ChgTOX(SwTOXBase & rTOX, const SwTOXBase & rNew)
|
|
|
|
{
|
|
|
|
if (DoesUndo())
|
|
|
|
{
|
2005-03-29 13:36:40 +00:00
|
|
|
DelAllUndoObj();
|
|
|
|
|
2004-05-18 13:01:12 +00:00
|
|
|
SwUndo * pUndo = new SwUndoTOXChange(&rTOX, rNew);
|
|
|
|
|
|
|
|
AppendUndo(pUndo);
|
|
|
|
}
|
|
|
|
|
|
|
|
rTOX = rNew;
|
2005-03-29 13:36:40 +00:00
|
|
|
|
|
|
|
if (rTOX.ISA(SwTOXBaseSection))
|
|
|
|
{
|
|
|
|
static_cast<SwTOXBaseSection &>(rTOX).Update();
|
|
|
|
static_cast<SwTOXBaseSection &>(rTOX).UpdatePageNum();
|
|
|
|
}
|
2004-05-18 13:01:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// #111827#
|
|
|
|
String SwDoc::GetPaMDescr(const SwPaM & rPam) const
|
|
|
|
{
|
|
|
|
String aResult;
|
|
|
|
bool bOK = false;
|
|
|
|
|
|
|
|
if (rPam.GetNode(TRUE) == rPam.GetNode(FALSE))
|
|
|
|
{
|
|
|
|
SwTxtNode * pTxtNode = rPam.GetNode(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(TRUE))
|
|
|
|
{
|
|
|
|
if (0 != rPam.GetNode(FALSE))
|
|
|
|
aResult += String(SW_RES(STR_PARAGRAPHS));
|
|
|
|
|
|
|
|
bOK = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! bOK)
|
|
|
|
aResult += String("??", RTL_TEXTENCODING_ASCII_US);
|
|
|
|
|
|
|
|
return aResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -> #111840#
|
|
|
|
SwField * SwDoc::GetField(const SwPosition & rPos)
|
|
|
|
{
|
|
|
|
SwField * pResult = NULL;
|
|
|
|
|
|
|
|
SwTxtFld * pAttr = rPos.nNode.GetNode().GetTxtNode()->
|
|
|
|
GetTxtFld(rPos.nContent);
|
|
|
|
|
|
|
|
if (pAttr)
|
|
|
|
pResult = (SwField *) pAttr->GetFld().GetFld();
|
|
|
|
|
|
|
|
return pResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
SwTxtFld * SwDoc::GetTxtFld(const SwPosition & rPos)
|
|
|
|
{
|
|
|
|
SwTxtNode *pNode = rPos.nNode.GetNode().GetTxtNode();
|
|
|
|
if( pNode )
|
|
|
|
return pNode->GetTxtFld( rPos.nContent );
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
// <- #111840#
|
|
|
|
|
2004-02-26 14:26:20 +00:00
|
|
|
bool SwDoc::ContainsHiddenChars() const
|
|
|
|
{
|
|
|
|
for( ULONG n = GetNodes().Count(); n; )
|
|
|
|
{
|
|
|
|
SwNode* pNd = GetNodes()[ --n ];
|
|
|
|
if ( ND_TEXTNODE == pNd->GetNodeType() &&
|
|
|
|
((SwTxtNode*)pNd)->HasHiddenCharAttribute( false ) )
|
|
|
|
return true;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-02-26 14:26:20 +00:00
|
|
|
return false;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
SwUnoCrsr* SwDoc::CreateUnoCrsr( const SwPosition& rPos, BOOL bTblCrsr )
|
2004-03-08 12:25:56 +00:00
|
|
|
{
|
2006-08-14 14:54:56 +00:00
|
|
|
SwUnoCrsr* pNew;
|
|
|
|
if( bTblCrsr )
|
|
|
|
pNew = new SwUnoTableCrsr( rPos );
|
|
|
|
else
|
|
|
|
pNew = new SwUnoCrsr( rPos );
|
2004-03-08 12:25:56 +00:00
|
|
|
|
2006-08-14 14:54:56 +00:00
|
|
|
pUnoCrsrTbl->Insert( pNew, pUnoCrsrTbl->Count() );
|
|
|
|
return pNew;
|
|
|
|
}
|
2004-03-08 12:25:56 +00:00
|
|
|
|
2005-11-08 16:15:45 +00:00
|
|
|
void SwDoc::ChkCondColls()
|
|
|
|
{
|
|
|
|
for (USHORT n = 0; n < pTxtFmtCollTbl->Count(); n++)
|
|
|
|
{
|
|
|
|
SwTxtFmtColl *pColl = (*pTxtFmtCollTbl)[n];
|
|
|
|
|
|
|
|
if (RES_CONDTXTFMTCOLL == pColl->Which())
|
|
|
|
{
|
|
|
|
SwClientIter aIter(*pColl);
|
|
|
|
|
|
|
|
SwClient * pClient = aIter.First(TYPE(SwTxtNode));
|
|
|
|
while (pClient)
|
|
|
|
{
|
|
|
|
SwTxtNode * pTxtNode = static_cast<SwTxtNode *>(pClient);
|
|
|
|
|
|
|
|
pTxtNode->ChkCondColl();
|
|
|
|
|
|
|
|
pClient = aIter.Next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-08-14 14:54:56 +00:00
|
|
|
|