Update ooo320-m1
[ooovba.git] / binfilter / inc / bf_sw / ndhints.hxx
blob472bc68a632e399ce5faad5a09476393fac05a8e
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ndhints.hxx,v $
10 * $Revision: 1.6 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
30 #ifndef _NDHINTS_HXX
31 #define _NDHINTS_HXX
34 #ifndef _SVARRAY_HXX //autogen
35 #include <bf_svtools/svarray.hxx>
36 #endif
38 #ifndef _SVMEMPOOL_HXX //autogen
39 #include <tools/mempool.hxx>
40 #endif
42 #include "numrule.hxx"
43 #include <vector>
44 namespace binfilter {
46 class SwTxtNode;
47 class SwRegHistory; // steht im RolBck.hxx
48 class SwTxtAttr;
51 * Ableitung der Klasse SwpHints ueber den Umweg ueber SwpHts, da
52 * lediglich die Klasse SwTxtNode Attribute einfuegen und
53 * loeschen koennen soll. Anderen Klassen wie den Frames steht
54 * lediglich ein lesender Zugriff ueber den Index-Operator zur
55 * Verfuegung.
56 * Groesse beim Anlegen gleich 1, weil nur dann ein Array erzeug wird, wenn
57 * auch ein Hint eingefuegt wird.
60 /*************************************************************************
61 * class SwpHtStart/End
62 *************************************************************************/
64 SV_DECL_PTRARR_SORT(SwpHtStart,SwTxtAttr*,1,1)
65 SV_DECL_PTRARR_SORT(SwpHtEnd,SwTxtAttr*,1,1)
67 /*************************************************************************
68 * class SwpHintsArr
69 *************************************************************************/
71 // Das neue Hintsarray:
72 class SwpHintsArr : private SwpHtStart
75 protected:
76 SwpHtEnd aHtEnd;
78 public:
79 void Insert( const SwTxtAttr *pHt );
80 void Delete( const SwTxtAttr *pHt );
81 void DeleteAtPos( const USHORT nPosInStart );
82 BOOL Resort();
83 SwTxtAttr *Cut( const USHORT nPosInStart );
85 inline const SwTxtAttr *GetStart( const USHORT nPos ) const { return (*this)[nPos]; }
86 inline const SwTxtAttr *GetEnd( const USHORT nPos ) const { return aHtEnd[nPos]; }
87 inline SwTxtAttr *GetStart( const USHORT nPos ) { return GetHt(nPos); }
88 inline SwTxtAttr *GetEnd( const USHORT nPos ) { return aHtEnd[nPos]; }
89 inline USHORT GetEndCount() const { return aHtEnd.Count(); }
90 inline USHORT GetStartCount() const { return Count(); }
91 inline USHORT GetStartOf( const SwTxtAttr *pHt ) const;
92 inline USHORT GetEndOf( const SwTxtAttr *pHt ) const;
93 inline USHORT GetPos( const SwTxtAttr *pHt ) const
94 // OS: in svmem.hxx wird fuer TCPP GetPos ohne const gerufen
95 #ifdef TCPP
96 { return SwpHtStart::GetPos( (SwTxtAttr *)pHt ); }
97 #else
98 { return SwpHtStart::GetPos( pHt ); }
99 #endif
101 #ifdef USED
102 // Der Zugriffsoperator soll bald nur noch const sein!
103 inline SwTxtAttr *operator[]( const USHORT nIdx ) { return SwpHtStart::operator[](nIdx); }
104 #endif
107 inline SwTxtAttr *GetHt( const USHORT nIdx ) { return SwpHtStart::operator[](nIdx); }
108 inline const SwTxtAttr *operator[]( const USHORT nIdx )const
109 { return SwpHtStart::operator[](nIdx); }
110 inline USHORT Count() const { return SwpHtStart::Count(); }
112 // Methoden vom PtrArr weiterreichen, wird fuer Node::_Cut benoetigt
113 const SwTxtAttr** GetData() const { return SwpHtStart::GetData(); }
115 #ifndef PRODUCT
116 BOOL Check() const;
117 #endif
120 /*************************************************************************
121 * class SwpHints
122 *************************************************************************/
124 // Die public-Schnittstelle zum Node hin
125 class SwpHints: public SwpHintsArr
127 private:
128 SwRegHistory* pHistory;
129 // Numerierung
130 BOOL bVis :1; // HiddenParaFld
131 BOOL bFntChg :1; // Fontwechsel
132 BOOL bFtn :1; // Fussnoten
133 BOOL bInSplitNode: 1; // TRUE: der Node ist im Split und die Frames
134 // werden verschoben!
135 BOOL bDDEFlds : 1; // es sind DDE-Felder am TextNode vorhanden
136 BOOL bCalcVis : 1; // bVis ist invalid, CalcVisibleFlag() rufen
138 BOOL Resort( const USHORT nPos );
139 // loescht Hints, die keinen Zustaendigkeitsbereich mehr haben
140 void ClearDummies( SwTxtNode &rNode );
141 // Merge verschmilzt aneinanderreichende Hints mit gleichen Attributen
142 // und gleichen Werten, falls nichts dagegen spricht, d.h. wenn dadurch
143 // keine Ueberlappungen mit gleichartigen Attr. entstehen,
144 // Ist der Rueckgabewert TRUE, so wurde verschmolzen und dabei u.a. auch
145 // ein Resort ausgeloest.
146 BOOL Merge( SwTxtNode &rNode, SwTxtAttr* pAttr = 0 );
147 // Haelt ein neues Attribut in pHistory fest.
149 void CalcFlags( );
151 // die Delete Methoden duerfen nur vom TextNode gerufen werden !!
152 // Dieser sorgt dafuer, das bei Attributen ohne Ende auch das
153 // entsp. Zeichen entfernt wird !!
154 friend class SwTxtNode;
155 void DeleteAtPos( const USHORT nPos );
156 // Ist der Hint schon bekannt, dann suche die Position und loesche ihn.
157 // Ist er nicht im Array, so gibt es ein ASSERT !!
158 void Delete( SwTxtAttr* pTxtHt );
160 public:
161 inline BOOL CanBeDeleted() const { return !Count(); }
163 // damit das SwDoc::Undo ueber alle Attributaenderungen informiert
164 // wird, gibt es hier einen Pointer auf die History. Nur wenn dieser
165 // != 0 ist, muessen alle Attributaenderungen "gemeldet" werden.
166 void Register( SwRegHistory* pHist ) { pHistory = pHist; }
167 void DeRegister() { Register(0); }
169 void Insert( SwTxtAttr *pHt, SwTxtNode &rNode, USHORT nMode = 0 );
171 // Forget signalisiert, dass es ueberfluessig ist, das Attribut einzu-
172 // fuegen, da es keinen Zustaendigkeitsbereich haette.
173 BOOL Forget( const std::vector< const SwTxtAttr* >* pExclude,
174 const USHORT i, const USHORT nWhich,
175 const xub_StrLen nStrt, const xub_StrLen nEnd );
177 inline void SetCalcVisible(){ bCalcVis = TRUE; }
178 inline void SetVisible( const BOOL bNew ) { bVis = bNew; }
179 inline BOOL IsVisible() const
180 { if( bCalcVis ) ((SwpHints*)this)->CalcVisibleFlag(); return bVis; }
181 inline BOOL HasFntChg() const { return bFntChg; }
182 inline BOOL HasFtn() const { return bFtn; }
183 inline BOOL IsInSplitNode() const { return bInSplitNode; }
184 inline BOOL HasDDEFld() const { return bDDEFlds; }
186 // Konstruktor (wird im nur einmal benutzt!)
187 SwpHints()
189 pHistory = 0;
190 bFntChg = bVis = TRUE;
191 bDDEFlds = bFtn = bInSplitNode = bCalcVis = FALSE;
194 // Berechnung von bVis, return-Wert TRUE bei Aenderung
195 BOOL CalcVisibleFlag();
197 DECL_FIXEDMEMPOOL_NEWDEL(SwpHints)
200 // Ausgabeoperator fuer die Texthints
201 SvStream &operator<<(SvStream &aS, const SwpHints &rHints); //$ ostream
203 /*************************************************************************
204 * Inline-Implementationen
205 *************************************************************************/
207 inline USHORT SwpHintsArr::GetStartOf( const SwTxtAttr *pHt ) const
209 USHORT nPos;
210 if( !Seek_Entry( pHt, &nPos ) )
211 nPos = USHRT_MAX;
212 return nPos;
215 inline USHORT SwpHintsArr::GetEndOf( const SwTxtAttr *pHt ) const
217 USHORT nPos;
218 if( !aHtEnd.Seek_Entry( pHt, &nPos ) )
219 nPos = USHRT_MAX;
220 return nPos;
223 inline SwTxtAttr *SwpHintsArr::Cut( const USHORT nPosInStart )
225 SwTxtAttr *pHt = GetHt(nPosInStart);
226 DeleteAtPos( nPosInStart );
227 return pHt;
231 } //namespace binfilter
232 #endif