1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ndhints.hxx,v $
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 ************************************************************************/
34 #ifndef _SVARRAY_HXX //autogen
35 #include <bf_svtools/svarray.hxx>
38 #ifndef _SVMEMPOOL_HXX //autogen
39 #include <tools/mempool.hxx>
42 #include "numrule.hxx"
47 class SwRegHistory
; // steht im RolBck.hxx
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
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 /*************************************************************************
69 *************************************************************************/
71 // Das neue Hintsarray:
72 class SwpHintsArr
: private SwpHtStart
79 void Insert( const SwTxtAttr
*pHt
);
80 void Delete( const SwTxtAttr
*pHt
);
81 void DeleteAtPos( const USHORT nPosInStart
);
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
96 { return SwpHtStart::GetPos( (SwTxtAttr
*)pHt
); }
98 { return SwpHtStart::GetPos( pHt
); }
102 // Der Zugriffsoperator soll bald nur noch const sein!
103 inline SwTxtAttr
*operator[]( const USHORT nIdx
) { return SwpHtStart::operator[](nIdx
); }
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(); }
120 /*************************************************************************
122 *************************************************************************/
124 // Die public-Schnittstelle zum Node hin
125 class SwpHints
: public SwpHintsArr
128 SwRegHistory
* pHistory
;
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.
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
);
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!)
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
210 if( !Seek_Entry( pHt
, &nPos
) )
215 inline USHORT
SwpHintsArr::GetEndOf( const SwTxtAttr
*pHt
) const
218 if( !aHtEnd
.Seek_Entry( pHt
, &nPos
) )
223 inline SwTxtAttr
*SwpHintsArr::Cut( const USHORT nPosInStart
)
225 SwTxtAttr
*pHt
= GetHt(nPosInStart
);
226 DeleteAtPos( nPosInStart
);
231 } //namespace binfilter