Update ooo320-m1
[ooovba.git] / binfilter / inc / bf_sw / ndtxt.hxx
blob22ee61b7b1b2a722c1fd038f5c390556e1b2484d
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: ndtxt.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 _NDTXT_HXX
31 #define _NDTXT_HXX
33 #ifndef _NODE_HXX
34 #include <node.hxx>
35 #endif
36 #ifndef _HINTIDS_HXX
37 #include <hintids.hxx>
38 #endif
39 #ifndef _NDHINTS_HXX
40 #include <ndhints.hxx>
41 #endif
42 #ifndef _ERRHDL_HXX
43 #include <errhdl.hxx>
44 #endif
45 namespace com { namespace sun { namespace star { namespace uno {
46 template < class > class Sequence;
47 }}}}
48 class OutputDevice;
49 namespace utl {
50 class TransliterationWrapper;
51 }//STRIP008 ;
52 namespace binfilter {
56 class SwNumRules;
57 class SwTxtFmtColl;
58 class SwCntntFrm;
59 class SwTxtFld; // Fuer GetTxtFld()
60 class SwAttrSet;
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
67 class SwNodeNum;
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;
77 //STRIP008 }}}}
79 // --------------------
80 // SwTxtNode
81 // --------------------
82 class SwTxtNode: public SwCntntNode
84 // fuer das Erzeugen des ersten TextNode
85 friend class SwDoc; // CTOR und AppendTxtNode()
86 friend class SwNodes;
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!
92 SwpHints *pSwpHints;
93 SwWrongList *pWrong; // Rechtschreibfehler nach Online-Spelling
94 SwNodeNum *pNdNum; // Numerierung fuer diesen Absatz
95 SwNodeNum *pNdOutl; // Outline fuer diesen Absatz
96 XubString aText;
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,
111 BOOL bPool = TRUE );
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;
121 public:
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;
139 // steht in itratr
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!!)
238 // Numerierung
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;
253 #else
254 USHORT GetLang( const xub_StrLen nBegin, const xub_StrLen nLen = 0) const;
255 #endif
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;
292 // aus SwIndexReg
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);
308 return *pSwpHints;
310 inline const SwpHints &SwTxtNode::GetSwpHints() const
312 ASSERT_ID( pSwpHints, ERR_NOHINTS);
313 return *pSwpHints;
316 inline SwpHints& SwTxtNode::GetOrCreateSwpHints()
318 if( !pSwpHints )
319 pSwpHints = new SwpHints;
320 return *pSwpHints;
323 inline SwTxtFmtColl* SwTxtNode::GetTxtColl() const
325 return (SwTxtFmtColl*)GetRegisteredIn();
328 // fuer den IBM-Compiler nicht inlinen wg. 42876
329 #ifndef ICC
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;
341 #endif
342 #endif
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
352 #endif