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 #include <svtools/svarray.hxx>
35 #include <tools/mempool.hxx>
37 #include "swtypes.hxx"
39 //#include "numrule.hxx"
42 class SwRegHistory
; // steht im RolBck.hxx
44 class SwTxtAttrNesting
;
50 SW_DLLPRIVATE SwTxtAttr
*
51 MakeTxtAttr( SwDoc
& rDoc
, SfxPoolItem
& rNew
,
52 xub_StrLen nStt
, xub_StrLen nEnd
);
53 SW_DLLPRIVATE SwTxtAttr
*
54 MakeTxtAttr( SwDoc
& rDoc
, const SfxItemSet
& rSet
,
55 xub_StrLen nStt
, xub_StrLen nEnd
);
57 // create redline dummy text hint that must not be inserted into hints array
58 SW_DLLPRIVATE SwTxtAttr
*
59 MakeRedlineTxtAttr( SwDoc
& rDoc
, SfxPoolItem
& rAttr
);
63 * Ableitung der Klasse SwpHints ueber den Umweg ueber SwpHts, da
64 * lediglich die Klasse SwTxtNode Attribute einfuegen und
65 * loeschen koennen soll. Anderen Klassen wie den Frames steht
66 * lediglich ein lesender Zugriff ueber den Index-Operator zur
68 * Groesse beim Anlegen gleich 1, weil nur dann ein Array erzeug wird, wenn
69 * auch ein Hint eingefuegt wird.
72 /*************************************************************************
73 * class SwpHtStart/End
74 *************************************************************************/
76 SV_DECL_PTRARR_SORT(SwpHtStart
,SwTxtAttr
*,1,1)
77 SV_DECL_PTRARR_SORT(SwpHtEnd
,SwTxtAttr
*,1,1)
79 /*************************************************************************
81 *************************************************************************/
88 SwpHtStart m_HintStarts
;
91 //FIXME: why are the non-const methods public?
93 void Insert( const SwTxtAttr
*pHt
);
94 void DeleteAtPos( const USHORT nPosInStart
);
96 SwTxtAttr
* Cut( const USHORT nPosInStart
);
98 inline const SwTxtAttr
* GetStart( const USHORT nPos
) const
99 { return m_HintStarts
[nPos
]; }
100 inline const SwTxtAttr
* GetEnd ( const USHORT nPos
) const
101 { return m_HintEnds
[nPos
]; }
102 inline SwTxtAttr
* GetStart( const USHORT nPos
)
103 { return m_HintStarts
[nPos
]; }
104 inline SwTxtAttr
* GetEnd ( const USHORT nPos
)
105 { return m_HintEnds
[nPos
]; }
107 inline USHORT
GetEndCount() const { return m_HintEnds
.Count(); }
108 inline USHORT
GetStartCount() const { return m_HintStarts
.Count(); }
110 inline USHORT
GetStartOf( const SwTxtAttr
*pHt
) const;
111 inline USHORT
GetPos( const SwTxtAttr
*pHt
) const
112 { return m_HintStarts
.GetPos( pHt
); }
114 inline SwTxtAttr
* GetTextHint( const USHORT nIdx
)
115 { return GetStart(nIdx
); }
116 inline const SwTxtAttr
* operator[]( const USHORT nIdx
) const
117 { return m_HintStarts
[nIdx
]; }
118 inline USHORT
Count() const { return m_HintStarts
.Count(); }
125 /*************************************************************************
127 *************************************************************************/
130 class SwpHints
: public SwpHintsArray
133 SwRegHistory
* m_pHistory
; // for Undo
135 bool m_bFontChange
: 1; // font change
136 // true: the Node is in Split and Frames are moved
137 bool m_bInSplitNode
: 1;
138 // m_bHasHiddenParaField is invalid, call CalcHiddenParaField()
139 bool m_bCalcHiddenParaField
: 1;
140 bool m_bHasHiddenParaField
: 1; // HiddenParaFld
141 bool m_bFootnote
: 1; // footnotes
142 bool m_bDDEFields
: 1; // the TextNode has DDE fields
144 // records a new attibute in m_pHistory.
145 void NoteInHistory( SwTxtAttr
*pAttr
, const bool bNew
= false );
149 // Delete methods may only be called by the TextNode!
150 // Because the TextNode also guarantees removal of the Character for
151 // attributes without an end.
152 friend class SwTxtNode
;
153 void DeleteAtPos( const USHORT nPos
);
154 // Delete the given Hint. The Hint must actually be in the array!
155 void Delete( SwTxtAttr
* pTxtHt
);
157 inline void SetInSplitNode(bool bInSplit
) { m_bInSplitNode
= bInSplit
; }
158 inline void SetCalcHiddenParaField() { m_bCalcHiddenParaField
= true; }
159 inline void SetHiddenParaField( const bool bNew
)
160 { m_bHasHiddenParaField
= bNew
; }
161 inline bool HasHiddenParaField() const
163 if ( m_bCalcHiddenParaField
)
165 (const_cast<SwpHints
*>(this))->CalcHiddenParaField();
167 return m_bHasHiddenParaField
;
170 void InsertNesting(SwTxtAttrNesting
& rNewHint
);
171 bool TryInsertNesting(SwTxtNode
& rNode
, SwTxtAttrNesting
& rNewHint
);
172 void BuildPortions( SwTxtNode
& rNode
, SwTxtAttr
& rNewHint
,
173 const SetAttrMode nMode
);
174 bool MergePortions( SwTxtNode
& rNode
);
179 inline bool CanBeDeleted() const { return !Count(); }
181 // register a History, which receives all attribute changes (for Undo)
182 void Register( SwRegHistory
* pHist
) { m_pHistory
= pHist
; }
183 // deregister the currently registered History
184 void DeRegister() { Register(0); }
185 SwRegHistory
* GetHistory() const { return m_pHistory
; }
187 /// try to insert the hint
188 /// @return true iff hint successfully inserted
189 bool TryInsertHint( SwTxtAttr
* const pHint
, SwTxtNode
& rNode
,
190 const SetAttrMode nMode
= nsSetAttrMode::SETATTR_DEFAULT
);
192 inline bool HasFtn() const { return m_bFootnote
; }
193 inline bool IsInSplitNode() const { return m_bInSplitNode
; }
195 // calc current value of m_bHasHiddenParaField, returns true iff changed
196 bool CalcHiddenParaField();
198 DECL_FIXEDMEMPOOL_NEWDEL(SwpHints
)
201 // Ausgabeoperator fuer die Texthints
202 SvStream
&operator<<(SvStream
&aS
, const SwpHints
&rHints
); //$ ostream
204 /*************************************************************************
205 * Inline Implementations
206 *************************************************************************/
208 inline USHORT
SwpHintsArray::GetStartOf( const SwTxtAttr
*pHt
) const
211 if ( !m_HintStarts
.Seek_Entry( pHt
, &nPos
) )
218 inline SwTxtAttr
*SwpHintsArray::Cut( const USHORT nPosInStart
)
220 SwTxtAttr
*pHt
= GetTextHint(nPosInStart
);
221 DeleteAtPos( nPosInStart
);