office-gobmx/sw/inc/ndarr.hxx
Jens-Heiner Rechtien 57d9cc8bae CWS-TOOLING: integrate CWS outlinelevel
2008-12-19 10:32:51 +0100 od  r265718 : #i70748# method <SwWW8Writer::StartTOX(..)>
	 - correction for custom to outline style
	   assigned paragraph styles
2008-12-19 09:24:41 +0100 od  r265715 : #i70748# method <HandleModifyAtTxtNode(..)>
	 - retrieve former applied list style before potential
	   reset of empty list style due to set outline level
2008-12-17 15:33:57 +0100 hde  r265608 : #i97013#
2008-12-17 14:43:42 +0100 od  r265603 : #i70748# adjust fix i44177 - adjustment of to outline style assigned
	 paragraph styles only for OOo-Templates.
2008-12-17 12:59:42 +0100 od  r265598 : #i70748# method <XMLTextImportHelper::SetStyleAndAttrs(..)>
	 - special handling of OOo 2.x document regarding
	   outline numbering of headings.
2008-12-17 12:45:53 +0100 od  r265597 : #i70748# method <HandleModifyAtTxtNode(..)>
	 - correct determination of new and former applied list style
2008-12-17 10:18:41 +0100 od  r265581 : #i97312# method <XMLTextNumRuleInfo::Set(..)>
	 - check, if numbering rules instance contains any numbering rule.
2008-12-16 14:34:22 +0100 hde  r265542 : #i97013
2008-12-16 14:20:24 +0100 od  r265541 : #i70748# adjust documentation of "Which"-ID numbers
2008-12-16 14:19:49 +0100 od  r265539 : #i70748# Adjust Attribute-Function-Mapping table due to new attribute
2008-12-16 14:06:24 +0100 od  r265538 : #i70748# - Correct handling of to outline style assigned paragraph styles
	   on reset of all paragraph style attributes
	 - WW8 import: Consider refactoring of paragraph style's outline
	   level attribute - NO_NUMBERING define no longer exsits.
2008-12-16 10:37:19 +0100 od  r265530 : #i70478# Correction on moving outline paragraph up respectively down
	 in its outline level:
	 - Check also outline paragraph, which are not an outline via
	   a to outline style assigned paragraph style, if action is applicable.
2008-12-16 09:10:13 +0100 hde  r265523 : #i97277
2008-12-16 09:09:30 +0100 hde  r265522 : #i97277
2008-12-16 09:07:40 +0100 hde  r265521 : Added control and purged obsolete id's
2008-12-10 13:09:36 +0100 od  r265174 : #i70748# correction of previous fix due to warning-free code
2008-12-10 13:03:30 +0100 od  r265172 : #i70748# method <XMLTextImportHelper::SetStyleAndAttrs(..)>
	 - Due to performance issues avoid retrieving outline level value from paragraph's paragraph
	   style for each paragraph. Instead retrieve current outline level value from paragraph, 
           which is the inherited value from its paragraph style, and only when it is needed.
2008-12-09 16:50:36 +0100 ufi  r265117 : help
2008-12-09 16:49:50 +0100 ufi  r265116 : help
2008-12-09 15:45:05 +0100 od  r265107 : #i70748# method <XMLTextImportHelper::SetStyleAndAttrs(..)>
	 - some minor rework and check access to paragraph styles
2008-12-09 15:42:04 +0100 od  r265106 : #i70748# adjust name of local variable to avoid hiding of class variable
2008-12-09 15:40:51 +0100 od  r265105 : #i70748# correct initialization order
2008-12-09 15:35:07 +0100 od  r265101 : #i70748# remove duplicate entry in certain property map
2008-12-09 15:33:39 +0100 od  r265100 : #i70748# add end of file token
2008-12-07 15:11:54 +0100 zhaojianwei  r264952 : conflicts left not to be resolved when cws rebase
2008-12-04 14:52:21 +0100 zhaojianwei  r264846 : CWS-TOOLING: rebase CWS outlinelevel to trunk@264325 (milestone: DEV300:m36)
2008-11-28 03:42:09 +0100 zhaojianwei  r264525 : #i70748#: migrate CWS outlinelevel to SVN
2008-11-28 03:41:39 +0100 zhaojianwei  r264524 : #i70748#: migrate CWS outlinelevel to SVN
2008-11-28 03:41:11 +0100 zhaojianwei  r264523 : #i70748#: migrate CWS outlinelevel to SVN
2009-01-07 11:57:24 +00:00

347 lines
14 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: ndarr.hxx,v $
* $Revision: 1.20 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _NDARR_HXX
#define _NDARR_HXX
#include <com/sun/star/embed/XEmbeddedObject.hpp>
#include <svtools/svarray.hxx>
#ifndef _BPARR_HXX
#include <bparr.hxx>
#endif
#include <ndtyp.hxx>
#include <svtools/embedhlp.hxx>
#include <vector>
class Graphic;
class GraphicObject;
class String;
class SwAttrSet;
class SfxItemSet;
class SwCntntNode;
class SwDoc;
class SwGrfFmtColl;
class SwGrfNode;
class SwHistory;
class SwNode;
class SwNodeIndex;
class SwNodeRange;
class SwOLENode;
class SwOutlineNodes;
class SwPaM;
class SwSection;
class SwSectionFmt;
class SwSectionNode;
class SwStartNode;
class SwTableBoxFmt;
class SwTableFmt;
class SwTableLine;
class SwTableLineFmt;
class SwTableNode;
class SwTblToTxtSaves;
class SwTxtFmtColl;
class SwTxtNode;
class SwUndoTblToTxt;
class SwUndoTxtToTbl;
struct SwPosition;
// --------------------
// class SwNodes
// --------------------
typedef SwNode * SwNodePtr;
typedef BOOL (*FnForEach_SwNodes)( const SwNodePtr&, void* pArgs );
SV_DECL_PTRARR_SORT( SwOutlineNodes, SwNodePtr, 0, 10 )
class SW_DLLPUBLIC SwNodes: private BigPtrArray
{
friend class SwDoc;
friend class SwNode;
friend class SwNodeIndex;
SwNodeIndex* pRoot; // Liste aller Indizies auf Nodes
// --> OD 2008-05-14 #refactorlists# - removed <bSyncNumberAndNumRule>
void InsertNode( const SwNodePtr pNode,
const SwNodeIndex& rPos );
void InsertNode( const SwNodePtr pNode,
ULONG nPos );
// <--
SwDoc* pMyDoc; // in diesem Doc ist das Nodes-Array
SwNode *pEndOfPostIts, *pEndOfInserts, // das sind die festen Bereiche
*pEndOfAutotext, *pEndOfRedlines,
*pEndOfContent;
mutable SwOutlineNodes* pOutlineNds; // Array aller GliederiungsNodes
BOOL bInNodesDel : 1; // falls rekursiv aufgerufen wird
// Num/Outline nicht aktualisierem
BOOL bInDelUpdOutl : 1; // Flags fuers aktualisieren von Outl.
BOOL bInDelUpdNum : 1; // Flags fuers aktualisieren von Outl.
// fuer dier Verwaltung der Indizies
void RegisterIndex( SwNodeIndex& rIdx );
void DeRegisterIndex( SwNodeIndex& rIdx );
void RemoveNode( ULONG nDelPos, ULONG nLen, BOOL bDel );
// Aktionen auf die Nodes
void SectionUpDown( const SwNodeIndex & aStart, const SwNodeIndex & aEnd );
void DelNodes( const SwNodeIndex& rStart, ULONG nCnt = 1 );
void ChgNode( SwNodeIndex& rDelPos, ULONG nSize,
SwNodeIndex& rInsPos, BOOL bNewFrms );
void UpdtOutlineIdx( const SwNode& ); // Update ab Node alle OutlineNodes
void _CopyNodes( const SwNodeRange&, const SwNodeIndex&,
BOOL bNewFrms = TRUE, BOOL bTblInsDummyNode = FALSE ) const;
void _DelDummyNodes( const SwNodeRange& rRg );
protected:
SwNodes( SwDoc* pDoc );
public:
~SwNodes();
SwNodePtr operator[]( ULONG n ) const
{ return (SwNodePtr)BigPtrArray::operator[] ( n ); }
//JP 29.09.97: impl. steht im ndindex.hxx - sollte moeglichst bald auf die
// neue Schnittstelle angepasst werden
inline SwNodePtr operator[]( const SwNodeIndex& rIdx ) const;
ULONG Count() const { return BigPtrArray::Count(); }
void ForEach( FnForEach_SwNodes fnForEach, void* pArgs = 0 )
{
BigPtrArray::ForEach( 0, BigPtrArray::Count(),
(FnForEach) fnForEach, pArgs );
}
void ForEach( ULONG nStt, ULONG nEnd, FnForEach_SwNodes fnForEach, void* pArgs = 0 )
{
BigPtrArray::ForEach( nStt, nEnd, (FnForEach) fnForEach, pArgs );
}
void ForEach( const SwNodeIndex& rStart, const SwNodeIndex& rEnd,
FnForEach_SwNodes fnForEach, void* pArgs = 0 );
// eine noch leere Section
SwNode& GetEndOfPostIts() const { return *pEndOfPostIts; }
// Section fuer alle Fussnoten
SwNode& GetEndOfInserts() const { return *pEndOfInserts; }
// Section fuer alle Flys/Header/Footers
SwNode& GetEndOfAutotext() const { return *pEndOfAutotext; }
// Section fuer alle Redlines
SwNode& GetEndOfRedlines() const { return *pEndOfRedlines; }
// das ist der letzte EndNode einer SonderSection. Hier nach kommt nur
// noch die normale ContentSection (also der BodyText)
SwNode& GetEndOfExtras() const { return *pEndOfRedlines; }
// die normale ContentSection (also der BodyText)
SwNode& GetEndOfContent() const { return *pEndOfContent; }
// ist das NodesArray das normale vom Doc? (nicht das UndoNds, .. )
// Implementierung steht im doc.hxx (weil man dazu Doc kennen muss) !
BOOL IsDocNodes() const;
USHORT GetSectionLevel(const SwNodeIndex &rIndex) const;
void Delete(const SwNodeIndex &rPos, ULONG nNodes = 1);
BOOL _MoveNodes( const SwNodeRange&, SwNodes& rNodes, const SwNodeIndex&,
BOOL bNewFrms = TRUE );
void Move( SwPaM&, SwPosition&, SwNodes& rNodes, BOOL bSplitNd=TRUE );
void _Copy( const SwNodeRange& rRg, const SwNodeIndex& rInsPos,
BOOL bNewFrms = TRUE ) const
{ _CopyNodes( rRg, rInsPos, bNewFrms ); }
void SectionUp( SwNodeRange *);
void SectionDown( SwNodeRange *pRange, SwStartNodeType = SwNormalStartNode );
BOOL CheckNodesRange( const SwNodeIndex& rStt, const SwNodeIndex& rEnd ) const;
void GoStartOfSection(SwNodeIndex *) const;
void GoEndOfSection(SwNodeIndex *) const;
SwCntntNode* GoNext(SwNodeIndex *) const;
SwCntntNode* GoPrevious(SwNodeIndex *) const;
//Gehe zum naechsten/vorherigen Cntnt/Tabellennode, fuer den
//es LayoutFrames gibt, dabei Kopf-/Fusszeilen/Rahmen etc. nicht verlassen
SwNode* GoNextWithFrm(SwNodeIndex *) const;
SwNode* GoPreviousWithFrm(SwNodeIndex *) const;
// zum naechsten Content-Node, der nicht geschuetzt oder versteckt ist
// (beides auf FALSE ==> GoNext/GoPrevious!!!)
SwCntntNode* GoNextSection( SwNodeIndex *, int bSkipHidden = TRUE,
int bSkipProtect = TRUE ) const;
SwCntntNode* GoPrevSection( SwNodeIndex *, int bSkipHidden = TRUE,
int bSkipProtect = TRUE ) const;
// erzeuge ein leere Section von Start und EndNode. Darf nur gerufen
// werden, wenn eine neue Section mit Inhalt erzeugt werden soll.
// Zum Beispiel bei den Filtern/Undo/...
SwStartNode* MakeEmptySection( const SwNodeIndex& rIdx,
SwStartNodeType = SwNormalStartNode );
// die Impl. von "Make...Node" stehen in den angegebenen .ccx-Files
SwTxtNode *MakeTxtNode( const SwNodeIndex & rWhere,
SwTxtFmtColl *pColl,
SwAttrSet* pAutoAttr = 0 ); // in ndtxt.cxx
SwStartNode* MakeTextSection( const SwNodeIndex & rWhere,
SwStartNodeType eSttNdTyp,
SwTxtFmtColl *pColl,
SwAttrSet* pAutoAttr = 0 );
SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere,
const String& rGrfName,
const String& rFltName,
const Graphic* pGraphic,
SwGrfFmtColl *pColl,
SwAttrSet* pAutoAttr = 0,
BOOL bDelayed = FALSE ); // in ndgrf.cxx
SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere,
const GraphicObject& rGrfObj,
SwGrfFmtColl *pColl,
SwAttrSet* pAutoAttr = 0 ); // in ndgrf.cxx
SwOLENode *MakeOLENode( const SwNodeIndex & rWhere,
const svt::EmbeddedObjectRef&,
SwGrfFmtColl *pColl,
SwAttrSet* pAutoAttr = 0 ); // in ndole.cxx
SwOLENode *MakeOLENode( const SwNodeIndex & rWhere,
const String &rName,
sal_Int64 nAspect,
SwGrfFmtColl *pColl,
SwAttrSet* pAutoAttr ); // in ndole.cxx
// Array aller GliederiungsNodes;
const SwOutlineNodes& GetOutLineNds() const;
//void UpdateOutlineNode( const SwNode&, BYTE nOldLevel, BYTE nNewLevel );//#outline level,removed by zhaojianwei
// alle Nodes Updaten - Rule/Format-Aenderung
void UpdateOutlineNode(SwNode & rNd);
// fuege die Nodes fuer die Tabelle ein
// wenn Lines angegeben, erzeuge die Matrix aus Lines & Boxen
// ansonsten nur die Anzahl von Boxen.
/* #109161#
New parameter pAttrSet: If pAttrSet is non-null and contains an
adjust item it is propagated to the table cells. If there is an
adjust in pCntntTxtColl or pHeadlineTxtColl this adjust item
overrides the item in pAttrSet.
*/
SwTableNode* InsertTable( const SwNodeIndex& rNdIdx,
USHORT nBoxes, SwTxtFmtColl* pCntntTxtColl,
USHORT nLines = 0, USHORT nRepeat = 0,
SwTxtFmtColl* pHeadlineTxtColl = 0,
const SwAttrSet * pAttrSet = 0);
// erzeuge aus dem makierten Bereich eine ausgeglichene Tabelle
SwTableNode* TextToTable( const SwNodeRange& rRange, sal_Unicode cCh,
SwTableFmt* pTblFmt,
SwTableLineFmt* pLineFmt,
SwTableBoxFmt* pBoxFmt,
SwTxtFmtColl* pTxtColl,
SwUndoTxtToTbl* pUndo = 0 );
//create a table from a vector of NodeRanges - API support
SwTableNode* TextToTable( const std::vector< std::vector<SwNodeRange> >& rTableNodes,
SwTableFmt* pTblFmt,
SwTableLineFmt* pLineFmt,
SwTableBoxFmt* pBoxFmt,
SwTxtFmtColl* pTxtColl
/*, SwUndo... pUndo*/ );
// erzeuge aus der Tabelle wieder normalen Text
BOOL TableToText( const SwNodeRange& rRange, sal_Unicode cCh,
SwUndoTblToTxt* = 0 );
// steht im untbl.cxx und darf nur vom Undoobject gerufen werden
SwTableNode* UndoTableToText( ULONG nStt, ULONG nEnd,
const SwTblToTxtSaves& rSavedData );
// fuege in der Line, vor der InsPos eine neue Box ein. Das Format
// wird von der nachfolgenden (vorhergenden;wenn an Ende) genommen
// in der Line muss schon eine Box vorhanden sein !
BOOL InsBoxen( SwTableNode*, SwTableLine*, SwTableBoxFmt*,
// Formate fuer den TextNode der Box
SwTxtFmtColl*, const SfxItemSet* pAutoAttr,
USHORT nInsPos, USHORT nCnt = 1 );
// Splittet eine Tabelle in der Grund-Zeile, in der der Index steht.
// Alle GrundZeilen dahinter wandern in eine neue Tabelle/-Node.
// Ist das Flag bCalcNewSize auf TRUE, wird fuer beide neuen Tabellen
// die neue SSize aus dem Max der Boxen errechnet; vorrausgesetzt,
// die SSize ist "absolut" gesetzt (LONG_MAX)
// (Wird zur Zeit nur fuer den RTF-Parser benoetigt)
SwTableNode* SplitTable( const SwNodeIndex& rPos, BOOL bAfter = TRUE,
BOOL bCalcNewSize = FALSE );
// fuegt 2 Tabellen, die hintereinander stehen, wieder zusammen
BOOL MergeTable( const SwNodeIndex& rPos, BOOL bWithPrev = TRUE,
USHORT nMode = 0, SwHistory* pHistory = 0 );
// fuege eine neue SwSection ein
SwSectionNode* InsertSection( const SwNodeIndex& rNdIdx,
SwSectionFmt& rSectionFmt,
const SwSection&,
const SwNodeIndex* pEnde,
BOOL bInsAtStart = TRUE,
BOOL bCreateFrms = TRUE );
// in welchem Doc steht das Nodes-Array ?
SwDoc* GetDoc() { return pMyDoc; }
const SwDoc* GetDoc() const { return pMyDoc; }
// suche den vorhergehenden [/nachfolgenden ] ContentNode oder
// TabellenNode mit Frames. Wird kein Ende angeben, dann wird mit
// dem FrameIndex begonnen; ansonsten, wird mit dem vor rFrmIdx und
// dem hintern pEnd die Suche gestartet. Sollte kein gueltiger Node
// gefunden werden, wird 0 returnt. rFrmIdx zeigt auf dem Node mit
// Frames
SwNode* FindPrvNxtFrmNode( SwNodeIndex& rFrmIdx,
const SwNode* pEnd = 0 ) const;
//-> #112139#
SwNode * DocumentSectionStartNode(SwNode * pNode) const;
SwNode * DocumentSectionEndNode(SwNode * pNode) const;
//<- #112139#
private:
// privater Constructor, weil nie kopiert werden darf !!
SwNodes( const SwNodes & rNodes );
};
#endif