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: ndtxt.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 ************************************************************************/
37 #include <hintids.hxx>
40 #include <ndhints.hxx>
45 namespace com
{ namespace sun
{ namespace star
{ namespace uno
{
46 template < class > class Sequence
;
50 class TransliterationWrapper
;
59 class SwTxtFld
; // Fuer GetTxtFld()
63 struct SwSpellArgs
; // for Spell(), splargs.hxx
64 struct SwConversionArgs
; // for Convert(), splargs.hxx
65 class SwInterHyphInfo
; // for Hyphenate(), splargs.hxx
66 class SwWrongList
; // fuer OnlineSpelling
70 // Konstanten fuer das Text-Insert:
71 #define INS_DEFAULT 0x0000 // keine Extras
72 #define INS_EMPTYEXPAND 0x0001 // leere Hints beim Einfuegen aufspannen
73 #define INS_NOHINTEXPAND 0x0002 // Hints an der InsPos nicht aufspannen
75 //STRIP008 namespace com { namespace sun { namespace star { namespace uno {
76 //STRIP008 template < class > class Sequence;
79 // --------------------
81 // --------------------
82 class SwTxtNode
: public SwCntntNode
84 // fuer das Erzeugen des ersten TextNode
85 friend class SwDoc
; // CTOR und AppendTxtNode()
87 friend class SwTxtFrm
;
88 friend void SwpHints::Insert( SwTxtAttr
*, SwTxtNode
&, USHORT
);
90 //Kann 0 sein, nur dann nicht 0 wenn harte Attribute drin stehen.
91 //Also niemals direkt zugreifen!
93 SwWrongList
*pWrong
; // Rechtschreibfehler nach Online-Spelling
94 SwNodeNum
*pNdNum
; // Numerierung fuer diesen Absatz
95 SwNodeNum
*pNdOutl
; // Outline fuer diesen Absatz
98 SwTxtNode( const SwNodeIndex
&rWhere
, SwTxtFmtColl
*pTxtColl
,
99 SwAttrSet
* pAutoAttr
= 0 );
101 // Kopiert die Attribute an nStart nach pDest.
102 void CopyAttr( SwTxtNode
*pDest
, const xub_StrLen nStart
, const xub_StrLen nOldPos
);
104 SwTxtNode
* _MakeNewTxtNode( const SwNodeIndex
&, BOOL bNext
= TRUE
,
105 BOOL bChgFollow
= TRUE
);
107 void _Cut( SwTxtNode
*pDest
, const SwIndex
&rDestStart
,
108 const SwIndex
&rStart
, xub_StrLen nLen
, BOOL bUpdate
= TRUE
);
110 SwTxtAttr
* MakeTxtAttr( const SfxPoolItem
& rNew
, xub_StrLen nStt
, xub_StrLen nEnd
,
113 // Verlagere alles umfassende harte Attribute in den AttrSet des Absatzes
115 // lege den spz. AttrSet an
116 virtual void NewAttrSet( SwAttrPool
& );
118 void Replace0xFF( XubString
& rTxt
, xub_StrLen
& rTxtStt
,
119 xub_StrLen nEndPos
, BOOL bExpandFlds
) const;
122 const String
& GetTxt() const { return aText
; }
124 // Zugriff auf SwpHints
125 inline SwpHints
&GetSwpHints();
126 inline const SwpHints
&GetSwpHints() const;
127 inline SwpHints
*GetpSwpHints() { return pSwpHints
; }
128 inline const SwpHints
*GetpSwpHints() const { return pSwpHints
; }
129 void SetWrong( SwWrongList
*pNew
);
130 inline SwWrongList
*GetWrong() { return pWrong
; }
131 inline const SwWrongList
*GetWrong() const { return pWrong
; }
132 inline BOOL
HasHints() const { return pSwpHints
? TRUE
: FALSE
; }
133 inline SwpHints
&GetOrCreateSwpHints();
135 virtual ~SwTxtNode();
137 virtual xub_StrLen
Len() const;
142 * Einfuegen anderer Datentypen durch Erzeugen eines
143 * temporaeren Strings.
145 SwTxtNode
& Insert( xub_Unicode c
, const SwIndex
&rIdx
);
146 SwTxtNode
& Insert( const XubString
&rStr
, const SwIndex
&rIdx
,
147 const USHORT nMode
= INS_DEFAULT
);
149 SwTxtNode
& Erase( const SwIndex
&rIdx
, xub_StrLen nCount
= STRING_LEN
,
150 const USHORT nMode
= INS_DEFAULT
);
152 // Aktionen auf Attributen
153 // loesche alle TextAttribute die als Attribut im Set vorhanden sind
154 // (Set-Pointer != 0 ) oder alle deren Which-Wert mit nWhich mappen
155 // oder wenn Which = 0, alle.
156 void RstAttr( const SwIndex
&rIdx
, xub_StrLen nLen
, USHORT nWhich
= 0,
157 const SfxItemSet
* pSet
= 0, BOOL bInclRefToxMark
= FALSE
);
159 // loesche das Text-Attribut (muss beim Pool abgemeldet werden!)
160 void DestroyAttr( SwTxtAttr
* pAttr
);
162 // loesche alle Attribute aus dem SwpHintsArray.
164 // uebernehme den Pointer auf das Text-Attribut
165 BOOL
Insert( SwTxtAttr
*pAttr
, USHORT nMode
= 0 );
166 // lege ein neues TextAttribut an und fuege es ins SwpHints-Array ein
167 // returne den neuen Pointer (oder 0 bei Fehlern)!
168 SwTxtAttr
* Insert( const SfxPoolItem
& rAttr
,
169 xub_StrLen nStt
, xub_StrLen nEnd
, USHORT nMode
= 0 );
171 // setze diese Attribute am TextNode. Wird der gesamte Bereich umspannt,
172 // dann setze sie nur im AutoAttrSet (SwCntntNode:: SetAttr)
173 BOOL
SetAttr( const SfxItemSet
& rSet
,
174 xub_StrLen nStt
, xub_StrLen nEnd
, USHORT nMode
= 0 );
175 // erfrage die Attribute vom TextNode ueber den Bereich
176 BOOL
GetAttr( SfxItemSet
& rSet
, xub_StrLen nStt
, xub_StrLen nEnd
,
177 BOOL bOnlyTxtAttr
= FALSE
,
178 BOOL bGetFromChrFmt
= TRUE
) const;
180 // uebertrage Attribute eines AttrSets ( AutoFmt ) in das SwpHintsArray
181 void FmtToTxtAttr( SwTxtNode
* pNd
);
183 // loeschen eines einzelnen Attributes (fuer SwUndoAttr)
184 // ( nur das Attribut loeschen, dass mit Which,Start und End oder
185 // mit pTxtHint identisch ist (es gibt nur ein gueltiges))
186 // AUSNAHME: ToxMarks !!!
187 void Delete( USHORT nTxtWhich
, xub_StrLen nStart
, xub_StrLen nEnd
= 0 );
188 void Delete( SwTxtAttr
* pTxtAttr
, BOOL bThisOnly
= FALSE
);
190 // Aktionen auf Text und Attributen
191 void Copy(SwTxtNode
*pDest
, const SwIndex
&rStart
, USHORT nLen
);
192 void Copy(SwTxtNode
*pDest
, const SwIndex
&rDestStart
,
193 const SwIndex
&rStart
, xub_StrLen nLen
);
194 void Cut(SwTxtNode
*pDest
, const SwIndex
&rStart
, xub_StrLen nLen
);
195 inline void Cut(SwTxtNode
*pDest
, const SwIndex
&rDestStart
,
196 const SwIndex
&rStart
, xub_StrLen nLen
);
197 // ersetze im String an Position nIdx das Zeichen
198 void Replace( const SwIndex
& rStart
, xub_Unicode cCh
);
200 // virtuelle Methoden aus dem CntntNode
201 virtual SwCntntFrm
*MakeFrm();
202 virtual SwCntntNode
*SplitNode( const SwPosition
& );
203 virtual SwCntntNode
*JoinNext();
204 virtual SwCntntNode
*JoinPrev();
206 SwCntntNode
*AppendNode( const SwPosition
& );
208 // setze ggf. das DontExpand-Flag an INet bzw. Zeichenvorlagen
210 // gebe das vorgegebene Attribut, welches an der TextPosition (rIdx)
211 // gesetzt ist zurueck. Gibt es keines, returne 0-Pointer
212 // gesetzt heisst: Start <= rIdx < End
213 SwTxtAttr
*GetTxtAttr( const SwIndex
& rIdx
, USHORT nWhichHt
,
214 BOOL bExpand
= FALSE
) const;
216 // Diese Methode liefert nur Textattribute auf der Position nIdx
217 // zurueck, die kein EndIdx besitzen und denselben Which besitzen.
218 // Ueblicherweise steht an dieser Position ein CH_TXTATR.
219 // Bei RES_TXTATR_END entfaellt die Pruefung auf den Which-Wert.
220 SwTxtAttr
*GetTxtAttr( const xub_StrLen nIdx
,
221 const USHORT nWhichHt
= RES_TXTATR_END
) const;
223 SwTxtFld
*GetTxtFld( const SwIndex
& rIdx
)
224 { return (SwTxtFld
*)GetTxtAttr( rIdx
, RES_TXTATR_FIELD
); }
226 // Aktuelles Wort zurueckliefern
227 USHORT
Convert( SwConversionArgs
& );
229 inline SwTxtFmtColl
*GetTxtColl() const;
230 virtual SwFmtColl
*ChgFmtColl( SwFmtColl
* );
231 void _ChgTxtCollUpdateNum( const SwTxtFmtColl
* pOld
,
232 const SwTxtFmtColl
* pNew
);
234 // kopiere die Collection mit allen Autoformaten zum Dest-Node
235 // dieser kann auch in einem anderen Dokument stehen!
236 // (Methode steht im ndcopy.cxx!!)
239 const SwNodeNum
* UpdateNum( const SwNodeNum
& );
240 const SwNumRule
*GetNumRule() const;
241 const SwNodeNum
* GetNum() const { return pNdNum
; }
242 // OutlineNumerierung
243 const SwNodeNum
* UpdateOutlineNum( const SwNodeNum
& );
244 const SwNodeNum
* GetOutlineNum() const { return pNdOutl
; }
245 void NumRuleChgd(); // Frames benachrichtigen
246 XubString
GetNumString() const; // returnt Outline oder Num - String
247 long GetLeftMarginWithNum( BOOL bTxtLeft
= FALSE
) const;
248 BOOL
GetFirstLineOfsWithNum( short& rFirstOffset
) const;
250 #ifdef VERTICAL_LAYOUT
251 USHORT
GetLang( const xub_StrLen nBegin
, const xub_StrLen nLen
= 0,
252 USHORT nScript
= 0 ) const;
254 USHORT
GetLang( const xub_StrLen nBegin
, const xub_StrLen nLen
= 0) const;
256 // steht in ndcopy.cxx
257 virtual SwCntntNode
* MakeCopy( SwDoc
*, const SwNodeIndex
& ) const;
259 // interaktive Trennung: wir finden den TxtFrm und rufen sein CalcHyph
261 // Liefert einen String mit expandierten Feldern zurueck
262 // opt. die Kapitel/Nummer-String zurueck
263 XubString
GetExpandTxt( const xub_StrLen nIdx
= 0,
264 const xub_StrLen nLen
= STRING_LEN
,
265 const BOOL bWithNum
= FALSE
) const;
266 //Liefert fuer die Initalfunktion tatsaechliche Anzahl der Initialzeichen
267 //bei nWishLen == 0 die des ersten Wortes
268 USHORT
GetDropLen( USHORT nWishLen
) const;
270 // Berechnung des Visible-Flags
271 inline BOOL
CalcVisibleFlag()
272 { if(pSwpHints
) return pSwpHints
->CalcVisibleFlag(); return FALSE
; }
273 // Setzen des CalcVisible-Flags
274 inline void SetCalcVisible(){ if(pSwpHints
) pSwpHints
->SetCalcVisible(); }
276 // Ist der Absatz sichtbar
277 inline BOOL
IsVisible() const
278 { return pSwpHints
? pSwpHints
->IsVisible() : TRUE
; }
280 // Besitzt der Absatz Fussnoten?
281 inline BOOL
HasFtn() const {return pSwpHints
? pSwpHints
->HasFtn() : FALSE
;}
283 inline SwTxtAttr
* MakeTmpTxtAttr( const SfxPoolItem
& rNew
)
284 { return MakeTxtAttr( rNew
, 0, 0, FALSE
); }
286 TYPEINFO(); // fuer rtti
288 // fuers Umhaengen der TxtFmtCollections (Outline-Nummerierung!!)
289 virtual void Modify( SfxPoolItem
*, SfxPoolItem
* );
290 // virtual BOOL GetInfo( SfxPoolItem& ) const;
293 virtual void Update( const SwIndex
& aPos
, USHORT xub_StrLen
,
294 BOOL bNegativ
= FALSE
);
297 // change text to Upper/Lower/Hiragana/Katagana/...
300 DECL_FIXEDMEMPOOL_NEWDEL(SwTxtNode
)
303 //-----------------------------------------------------------------------------
305 inline SwpHints
&SwTxtNode::GetSwpHints()
307 ASSERT_ID( pSwpHints
, ERR_NOHINTS
);
310 inline const SwpHints
&SwTxtNode::GetSwpHints() const
312 ASSERT_ID( pSwpHints
, ERR_NOHINTS
);
316 inline SwpHints
& SwTxtNode::GetOrCreateSwpHints()
319 pSwpHints
= new SwpHints
;
323 inline SwTxtFmtColl
* SwTxtNode::GetTxtColl() const
325 return (SwTxtFmtColl
*)GetRegisteredIn();
328 // fuer den IBM-Compiler nicht inlinen wg. 42876
330 // Inline Metoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
331 #if !(defined(MACOSX) && ( __GNUC__ < 3 ))
332 // GrP moved to gcc_outl.cxx; revisit with gcc3
333 inline SwTxtNode
*SwNode::GetTxtNode()
335 return ND_TEXTNODE
== nNodeType
? (SwTxtNode
*)this : 0;
337 inline const SwTxtNode
*SwNode::GetTxtNode() const
339 return ND_TEXTNODE
== nNodeType
? (const SwTxtNode
*)this : 0;
344 inline void SwTxtNode::Cut(SwTxtNode
*pDest
, const SwIndex
&rDestStart
,
345 const SwIndex
&rStart
, xub_StrLen nLen
)
347 _Cut( pDest
, rDestStart
, rStart
, nLen
, TRUE
);
351 } //namespace binfilter