1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #ifndef SW_NDTXT_HXX
25 #define SW_NDTXT_HXX
26
27 #include <cppuhelper/weakref.hxx>
28
29 #include "swdllapi.h"
30 #include <error.h>
31 #include <node.hxx>
32 #include <hintids.hxx>
33 #include <ndhints.hxx>
34 #include <errhdl.hxx>
35 #include <modeltoviewhelper.hxx>
36 #include <SwNumberTreeTypes.hxx>
37 #include <IDocumentContentOperations.hxx>
38
39 #include <sfx2/Metadatable.hxx>
40
41 #include <vector>
42 #include <set>
43
44 class SfxHint;
45 class SwNumRule;
46 class SwNodeNum;
47 class SwList;
48 class SvxLRSpaceItem;
49
50 namespace utl {
51 class TransliterationWrapper;
52 }
53
54 class SwTxtFmtColl;
55 class SwCntntFrm;
56 class SwTxtFld;
57 class SwTxtInputFld;
58 class SfxItemSet;
59 class SwUndoTransliterate;
60
61
62 struct SwSpellArgs; // for Spell(), splargs.hxx
63 struct SwConversionArgs; // for Convert(), splargs.hxx
64 class SwInterHyphInfo; // for Hyphenate(), splargs.hxx
65 class SwWrongList; // for OnlineSpelling
66 class SwGrammarMarkUp;
67 class OutputDevice;
68 class SwScriptInfo;
69 struct SwDocStat;
70 struct SwParaIdleData_Impl;
71
72 namespace com { namespace sun { namespace star {
73 namespace uno {
74 template < class > class Sequence;
75 }
76 namespace text { class XTextContent; }
77 } } }
78
79 typedef std::set< xub_StrLen > SwSoftPageBreakList;
80
81 // --------------------
82 // SwTxtNode
83 // --------------------
84 class SW_DLLPUBLIC SwTxtNode: public SwCntntNode, public ::sfx2::Metadatable
85 {
86
87 // fuer das Erzeugen des ersten TextNode
88 friend class SwDoc; // CTOR und AppendTxtNode()
89 friend class SwNodes;
90 friend class SwTxtFrm;
91 friend class SwScriptInfo;
92
93 //Kann 0 sein, nur dann nicht 0 wenn harte Attribute drin stehen.
94 //Also niemals direkt zugreifen!
95 SwpHints *m_pSwpHints;
96
97 mutable SwNodeNum* mpNodeNum; // Numerierung fuer diesen Absatz
98 XubString m_Text;
99
100 SwParaIdleData_Impl* m_pParaIdleData_Impl;
101
102 // Some of the chars this para are hidden. Paragraph has to be reformatted
103 // on changing the view to print preview.
104 mutable bool m_bContainsHiddenChars : 1;
105 // The whole paragraph is hidden because of the hidden text attribute
106 mutable bool m_bHiddenCharsHidePara : 1;
107 // The last two flags have to be recalculated if this flag is set:
108 mutable bool m_bRecalcHiddenCharFlags : 1;
109
110 mutable bool m_bLastOutlineState : 1;
111 bool m_bNotifiable;
112
113 // sal_uInt8 nOutlineLevel; //#outline level, removed by zhaojianwei.
114
115 bool mbEmptyListStyleSetDueToSetOutlineLevelAttr;
116
117 // boolean, indicating that a <SetAttr(..)> or <ResetAttr(..)> or
118 // <ResetAllAttr(..)> method is running.
119 // Needed to avoid duplicate handling of attribute change actions.
120 bool mbInSetOrResetAttr;
121 // pointer to the list, to whose the text node is added to
122 SwList* mpList;
123 /// #i111677# cached expansion (for clipboard)
124 ::std::auto_ptr< ::rtl::OUString > m_pNumStringCache;
125
126 ::com::sun::star::uno::WeakReference<
127 ::com::sun::star::text::XTextContent> m_wXParagraph;
128
129 //UUUU DrawingLayer FillAttributes in a preprocessed form for primitive usage
130 drawinglayer::attribute::SdrAllFillAttributesHelperPtr maFillAttributes;
131
132 SW_DLLPRIVATE SwTxtNode( const SwNodeIndex &rWhere, SwTxtFmtColl *pTxtColl,
133 const SfxItemSet* pAutoAttr = 0 );
134
135 // Kopiert die Attribute an nStart nach pDest.
136 SW_DLLPRIVATE void CopyAttr( SwTxtNode *pDest, const xub_StrLen nStart, const xub_StrLen nOldPos);
137
138 SW_DLLPRIVATE SwTxtNode* _MakeNewTxtNode( const SwNodeIndex&, sal_Bool bNext = sal_True,
139 sal_Bool bChgFollow = sal_True );
140
141 SW_DLLPRIVATE void CutImpl(
142 SwTxtNode * const pDest, const SwIndex & rDestStart,
143 const SwIndex & rStart, /*const*/ xub_StrLen nLen,
144 const bool bUpdate = true );
145
146 // Verlagere alles umfassende harte Attribute in den AttrSet des Absatzes
147 SW_DLLPRIVATE void MoveTxtAttr_To_AttrSet(); // wird von SplitNode gerufen.
148
149 // lege den spz. AttrSet an
150 SW_DLLPRIVATE virtual void NewAttrSet( SwAttrPool& );
151
152 SW_DLLPRIVATE void Replace0xFF( XubString& rTxt, xub_StrLen& rTxtStt,
153 xub_StrLen nEndPos, sal_Bool bExpandFlds ) const;
154
155 // Optimization: Asking for information about hidden characters at SwScriptInfo
156 // updates these flags.
IsCalcHiddenCharFlags() const157 inline bool IsCalcHiddenCharFlags() const
158 { return m_bRecalcHiddenCharFlags; }
SetHiddenCharAttribute(bool bNewHiddenCharsHidePara,bool bNewContainsHiddenChars) const159 inline void SetHiddenCharAttribute( bool bNewHiddenCharsHidePara, bool bNewContainsHiddenChars ) const
160 {
161 m_bHiddenCharsHidePara = bNewHiddenCharsHidePara;
162 m_bContainsHiddenChars = bNewContainsHiddenChars;
163 m_bRecalcHiddenCharFlags = false;
164 }
165
166 SW_DLLPRIVATE void CalcHiddenCharFlags() const;
167
168 SW_DLLPRIVATE SwNumRule * _GetNumRule(sal_Bool bInParent = sal_True) const;
169
170 SW_DLLPRIVATE void SetLanguageAndFont( const SwPaM &rPaM,
171 LanguageType nLang, sal_uInt16 nLangWhichId,
172 const Font *pFont, sal_uInt16 nFontWhichId );
173
174 //
175 // Start: Data collected during idle time
176 //
177 SW_DLLPRIVATE void SetParaNumberOfWords( sal_uLong nTmpWords ) const;
178 SW_DLLPRIVATE sal_uLong GetParaNumberOfWords() const;
179 SW_DLLPRIVATE void SetParaNumberOfChars( sal_uLong nTmpChars ) const;
180 SW_DLLPRIVATE sal_uLong GetParaNumberOfChars() const;
181 SW_DLLPRIVATE void InitSwParaStatistics( bool bNew );
182
183 /** create number for this text node, if not already existing
184
185 @return number of this node
186 */
187 SwNodeNum* CreateNum() const;
188
189 inline void TryDeleteSwpHints();
190
191 SW_DLLPRIVATE void impl_FmtToTxtAttr(const SfxItemSet& i_rAttrSet);
192
193 const SwTxtInputFld* GetOverlappingInputFld( const SwTxtAttr& rTxtAttr ) const;
194
195 public:
196 //Bug 120881:Modify here for Directly Page Numbering
197 bool HasPageNumberField();
198 //Bug 120881(End)
199 bool IsWordCountDirty() const;
200 bool IsWrongDirty() const;
201 bool IsGrammarCheckDirty() const;
202 bool IsSmartTagDirty() const; // SMARTTAGS
203 bool IsAutoCompleteWordDirty() const;
204 void SetWordCountDirty( bool bNew ) const;
205 void SetWrongDirty( bool bNew ) const;
206 void SetGrammarCheckDirty( bool bNew ) const;
207 void SetSmartTagDirty( bool bNew ) const; // SMARTTAGS
208 void SetAutoCompleteWordDirty( bool bNew ) const;
209 void SetWrong( SwWrongList* pNew, bool bDelete = true );
210 SwWrongList* GetWrong();
211 const SwWrongList* GetWrong() const;
212 void SetGrammarCheck( SwGrammarMarkUp* pNew, bool bDelete = true );
213 SwGrammarMarkUp* GetGrammarCheck();
214 // SMARTTAGS
215 void SetSmartTags( SwWrongList* pNew, bool bDelete = true );
216 SwWrongList* GetSmartTags();
217 //Modify here for #119405, by easyfan, 2012-05-24
218 bool TryCharSetExpandToNum(const SfxItemSet& pCharSet);
219 //End of modification, by easyfan
220
221 //
222 // End: Data collected during idle time
223 //
224 protected:
225 // fuers Umhaengen der TxtFmtCollections (Outline-Nummerierung!!)
226 virtual void Modify( const SfxPoolItem*, const SfxPoolItem* );
227 virtual void SwClientNotify( const SwModify&, const SfxHint& );
228
229 public:
230 using SwCntntNode::GetAttr;
231
GetTxt() const232 const String& GetTxt() const { return m_Text; }
233
234 // getters for SwpHints
235 inline SwpHints &GetSwpHints();
236 inline const SwpHints &GetSwpHints() const;
GetpSwpHints()237 inline SwpHints *GetpSwpHints() { return m_pSwpHints; }
GetpSwpHints() const238 inline const SwpHints *GetpSwpHints() const { return m_pSwpHints; }
HasHints() const239 inline bool HasHints() const { return m_pSwpHints ? true : false; }
240 inline SwpHints &GetOrCreateSwpHints();
241
242 virtual ~SwTxtNode();
243
244 virtual xub_StrLen Len() const;
245
246 // steht in itratr
247 void GetMinMaxSize( sal_uLong nIndex, sal_uLong& rMin, sal_uLong &rMax, sal_uLong &rAbs,
248 OutputDevice* pOut = 0 ) const;
249
250 // overriding to handle change of certain paragraph attributes
251 virtual sal_Bool SetAttr( const SfxPoolItem& );
252 virtual sal_Bool SetAttr( const SfxItemSet& rSet );
253 virtual sal_Bool ResetAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 = 0 );
254 virtual sal_Bool ResetAttr( const SvUShorts& rWhichArr );
255 virtual sal_uInt16 ResetAllAttr();
256
257 /// insert text content
258 void InsertText( const XubString & rStr, const SwIndex & rIdx,
259 const enum IDocumentContentOperations::InsertFlags nMode
260 = IDocumentContentOperations::INS_DEFAULT );
261
262 /** delete text content
263 ATTENTION: must not be called with a range that overlaps the start of
264 an attribute with both extent and dummy char
265 */
266 void EraseText ( const SwIndex &rIdx, const xub_StrLen nCount = STRING_LEN,
267 const enum IDocumentContentOperations::InsertFlags nMode
268 = IDocumentContentOperations::INS_DEFAULT );
269
270 /** delete all attributes.
271 If neither pSet nor nWhich is given, delete all attributes (except
272 refmarks, toxmarks, meta) in range.
273 @param rIdx start position
274 @param nLen range in which attributes will be deleted
275 @param pSet if not 0, delete only attributes contained in pSet
276 @param nWhich if not 0, delete only attributes with matching which
277 @param bInclRefToxMark
278 refmarks, toxmarks, and metas will be ignored unless this is true
279 ATTENTION: setting bInclRefToxMark is only allowed from UNDO!
280 */
281 void RstTxtAttr(
282 const SwIndex &rIdx,
283 const xub_StrLen nLen,
284 const sal_uInt16 nWhich = 0,
285 const SfxItemSet* pSet = 0,
286 const sal_Bool bInclRefToxMark = sal_False );
287 void GCAttr();
288
289 // loesche das Text-Attribut (muss beim Pool abgemeldet werden!)
290 void DestroyAttr( SwTxtAttr* pAttr );
291
292 // loesche alle Attribute aus dem SwpHintsArray.
293 void ClearSwpHintsArr( bool bDelFields );
294
295 /// Insert pAttr into hints array. @return true if inserted successfully
296 bool InsertHint( SwTxtAttr * const pAttr,
297 const SetAttrMode nMode = nsSetAttrMode::SETATTR_DEFAULT );
298 /// create new text attribute from rAttr and insert it
299 /// @return inserted hint; 0 if not sure the hint is inserted
300 SwTxtAttr* InsertItem( SfxPoolItem& rAttr,
301 const xub_StrLen nStart, const xub_StrLen nEnd,
302 const SetAttrMode nMode = nsSetAttrMode::SETATTR_DEFAULT );
303
304 // setze diese Attribute am TextNode. Wird der gesamte Bereich umspannt,
305 // dann setze sie nur im AutoAttrSet (SwCntntNode:: SetAttr)
306 sal_Bool SetAttr(
307 const SfxItemSet& rSet,
308 const xub_StrLen nStt,
309 const xub_StrLen nEnd,
310 const SetAttrMode nMode = nsSetAttrMode::SETATTR_DEFAULT );
311
312 // erfrage die Attribute vom TextNode ueber den Bereich
313 // Introduce 4th optional parameter <bMergeIndentValuesOfNumRule>.
314 // If <bMergeIndentValuesOfNumRule> == sal_True, the indent attributes of
315 // the corresponding list level of an applied list style is merged into
316 // the requested item set as a LR-SPACE item, if <bOnlyTxtAttr> == sal_False,
317 // corresponding node has not its own indent attributes and the
318 // position-and-space mode of the list level is SvxNumberFormat::LABEL_ALIGNMENT.
319 sal_Bool GetAttr( SfxItemSet& rSet, xub_StrLen nStt, xub_StrLen nEnd,
320 sal_Bool bOnlyTxtAttr = sal_False,
321 sal_Bool bGetFromChrFmt = sal_True,
322 const bool bMergeIndentValuesOfNumRule = false ) const;
323 // <--
324
325 // uebertrage Attribute eines AttrSets ( AutoFmt ) in das SwpHintsArray
326 void FmtToTxtAttr( SwTxtNode* pNd );
327
328 /// delete all attributes of type nWhich at nStart (opt. end nEnd)
329 void DeleteAttributes( const sal_uInt16 nWhich,
330 const xub_StrLen nStart, const xub_StrLen nEnd = 0 );
331 /// delete the attribute pTxtAttr
332 void DeleteAttribute ( SwTxtAttr * const pTxtAttr );
333
334 // Aktionen auf Text und Attributen
335 // introduce optional parameter to control, if all attributes have to be copied.
336 void CopyText( SwTxtNode * const pDest,
337 const SwIndex &rStart,
338 const xub_StrLen nLen,
339 const bool bForceCopyOfAllAttrs = false );
340 void CopyText( SwTxtNode * const pDest,
341 const SwIndex &rDestStart,
342 const SwIndex &rStart,
343 xub_StrLen nLen,
344 const bool bForceCopyOfAllAttrs = false );
345
346 void CutText(SwTxtNode * const pDest,
347 const SwIndex & rStart, const xub_StrLen nLen);
348 inline void CutText(SwTxtNode * const pDest, const SwIndex &rDestStart,
349 const SwIndex & rStart, const xub_StrLen nLen);
350
351 /// replace nDelLen characters at rStart with rText
352 void ReplaceText( const SwIndex& rStart, const xub_StrLen nDelLen,
353 const XubString& rText );
354 void ReplaceTextOnly( xub_StrLen nPos, xub_StrLen nLen, const XubString& rText,
355 const ::com::sun::star::uno::Sequence<sal_Int32>& rOffsets );
356
357 // virtuelle Methoden aus dem CntntNode
358 virtual SwCntntFrm *MakeFrm( SwFrm* );
359 virtual SwCntntNode *SplitCntntNode( const SwPosition & );
360 virtual SwCntntNode *JoinNext();
361 virtual SwCntntNode *JoinPrev();
362
363 SwCntntNode *AppendNode( const SwPosition & );
364
365 // setze ggf. das DontExpand-Flag an INet bzw. Zeichenvorlagen
366 sal_Bool DontExpandFmt( const SwIndex& rIdx, bool bFlag = true,
367 sal_Bool bFmtToTxtAttributes = sal_True );
368
369 enum GetTxtAttrMode {
370 DEFAULT, /// DEFAULT: (Start <= nIndex < End)
371 EXPAND, /// EXPAND : (Start < nIndex <= End)
372 PARENT, /// PARENT : (Start < nIndex < End)
373 };
374
375 /** get the innermost text attribute covering position nIndex.
376 @param nWhich only attribute with this id is returned.
377 @param eMode the predicate for matching (@see GetTxtAttrMode).
378
379 ATTENTION: this function is not well-defined for those
380 hints of which several may cover a single position, like
381 RES_TXTATR_CHARFMT, RES_TXTATR_REFMARK, RES_TXTATR_TOXMARK
382 */
383 SwTxtAttr *GetTxtAttrAt(
384 xub_StrLen const nIndex,
385 RES_TXTATR const nWhich,
386 enum GetTxtAttrMode const eMode = DEFAULT ) const;
387
388 /** get the innermost text attributes covering position nIndex.
389 @param nWhich only attributes with this id are returned.
390 @param eMode the predicate for matching (@see GetTxtAttrMode).
391 */
392 ::std::vector<SwTxtAttr *> GetTxtAttrsAt(
393 xub_StrLen const nIndex,
394 RES_TXTATR const nWhich,
395 enum GetTxtAttrMode const eMode = DEFAULT ) const;
396
397 /** get the text attribute at position nIndex which owns
398 the dummy character CH_TXTATR_* at that position, if one exists.
399 @param nIndex the position in the text
400 @param nWhich if different from RES_TXTATR_END, return only
401 attribute with given which id
402 @return the text attribute at nIndex of type nWhich, if it exists
403 */
404 SwTxtAttr *GetTxtAttrForCharAt(
405 const xub_StrLen nIndex,
406 const RES_TXTATR nWhich = RES_TXTATR_END ) const;
407
408 SwTxtFld* GetFldTxtAttrAt(
409 const xub_StrLen nIndex,
410 const bool bIncludeInputFldAtStart = false ) const;
411
412 // Aktuelles Wort zurueckliefern
413 XubString GetCurWord(xub_StrLen) const;
414 sal_uInt16 Spell(SwSpellArgs*);
415 sal_uInt16 Convert( SwConversionArgs & );
416
417 inline SwTxtFmtColl *GetTxtColl() const;
418 virtual SwFmtColl *ChgFmtColl( SwFmtColl* );
419 void _ChgTxtCollUpdateNum( const SwTxtFmtColl* pOld,
420 const SwTxtFmtColl* pNew );
421
422 // kopiere die Collection mit allen Autoformaten zum Dest-Node
423 // dieser kann auch in einem anderen Dokument stehen!
424 // (Methode steht im ndcopy.cxx!!)
425 void CopyCollFmt( SwTxtNode& rDestNd );
426
427 //
428 // BEGIN OF BULLET/NUMBERING/OUTLINE STUFF:
429 //
430
431 /**
432 Returns numbering rule of this text node.
433
434 @param bInParent search in parent attributes, too
435
436 @return numbering rule of this text node or NULL if none is set
437 */
438 SwNumRule *GetNumRule(sal_Bool bInParent = sal_True) const;
439
GetNum() const440 inline const SwNodeNum* GetNum() const
441 {
442 return mpNodeNum;
443 }
444
445 SwNumberTree::tNumberVector GetNumberVector() const;
446
447 /**
448 Returns if this text node is an outline.
449
450 @retval true this text node is an outline
451 @retval false else
452 */
453 bool IsOutline() const;
454
455 bool IsOutlineStateChanged() const;
456
457 void UpdateOutlineState();
458
459 /**
460 Notify this textnode that its numbering rule has changed.
461 */
462 void NumRuleChgd();
463
464 /** Returns outline of numbering string
465
466 Introduce parameter <_bInclPrefixAndSuffixStrings> in order to control,
467 if the prefix and the suffix strings have to been included or not.
468
469 @param _bInclPrefixAndSuffixStrings
470 optional input parameter - boolean indicating, if the prefix and the
471 suffix strings have to been included or not. default value = <true>
472
473 @param _nRestrictToThisLevel
474 optional input parameter - unsigned integer indicating the maximum outline
475 level to which the output string must be restricted to. Default value is
476 MAXLEVEL
477 */
478 XubString GetNumString( const bool _bInclPrefixAndSuffixStrings = true, const unsigned int _nRestrictToThisLevel = MAXLEVEL ) const;
479
480 /**
481 Returns the additional indents of this text node and its numbering.
482
483 @param bTxtLeft ???
484
485 @return additional indents
486 */
487 long GetLeftMarginWithNum( sal_Bool bTxtLeft = sal_False ) const;
488
489 /**
490 Returns the combined first line indent of this text node and
491 its numbering.
492
493 @param the first line indent of this text node taking the
494 numbering into account (return parameter)
495
496 @retval sal_True this node has SwNodeNum and has numbering rule
497 @retval sal_False else
498 */
499 sal_Bool GetFirstLineOfsWithNum( short& rFirstOffset ) const;
500
501 SwTwips GetAdditionalIndentForStartingNewList() const;
502
503 // --> OD 2008-12-02 #i96772#
504 void ClearLRSpaceItemDueToListLevelIndents( SvxLRSpaceItem& o_rLRSpaceItem ) const;
505 // <--
506
507 /** return left margin for tab stop position calculation
508
509 OD 2008-06-30 #i91133#
510 Needed for text formatting
511 Method considers new list level attributes, which also can provide a left margin value
512
513 @author OD
514 */
515 long GetLeftMarginForTabCalculation() const;
516
517 /** -> #i29560
518 Returns if this text node has a number.
519
520 This text node has a number if it has a SwNodeNum and a
521 numbering rule and the numbering format specified for the
522 level of the SwNodeNum is of an enumeration type.
523
524 @retval sal_True This text node has a number.
525 @retval sal_False else
526 */
527 sal_Bool HasNumber() const;
528
529 /** -> #i29560
530 Returns if this text node has a bullet.
531
532 This text node has a bullet if it has a SwNodeNum and a
533 numbering rule and the numbering format specified for the
534 level of the SwNodeNum is of a bullet type.
535
536 @retval sal_True This text node has a bullet.
537 @retval sal_False else
538 */
539 sal_Bool HasBullet() const;
540
541 /** -> #i27615#
542 Returns is this text node is numbered.
543
544 This node is numbered if it has a SwNodeNum and it has a
545 numbering rule and has not a hidden SwNodeNum.
546
547 ATTENTION: Returns sal_True even if the SwNumFmt has type
548 SVX_NUM_NUMBER_NONE.
549
550 @retval sal_True This node is numbered.
551 @retval sal_False else
552 */
553 sal_Bool IsNumbered() const;
554
555 /** -> #i27615#
556 Returns if this text node has a marked label.
557
558 @retval true This text node has a marked label.
559 @retval false else
560 */
561 bool HasMarkedLabel() const;
562
563 /** Sets the list level of this text node.
564
565 Side effect, when the text node is a list item:
566 The text node's representation in the list tree (<SwNodeNum> instance)
567 is updated.
568
569 @param nLevel level to set
570 */
571 void SetAttrListLevel(int nLevel);
572
573 bool HasAttrListLevel() const;
574
575 int GetAttrListLevel() const;
576
577 /** Returns the actual list level of this text node, when it is a list item
578
579 @return the actual list level of this text node, if it is a list item,
580 -1 otherwise
581 */
582 int GetActualListLevel() const;
583
584 /**
585 Returns outline level of this text node.
586
587 If a text node has an outline number (i.e. it has an SwNodeNum
588 and a outline numbering rule) the outline level is the level of
589 this SwNodeNum.
590
591 If a text node has no outline number and has a paragraph style
592 attached the outline level is the outline level of the
593 paragraph style.
594
595 Otherwise the text node has no outline level (NO_NUMBERING).
596
597 NOTE: The outline level of text nodes is subject to change. The
598 plan is to have an SwTxtNode::nOutlineLevel member that is
599 updated from a paragraph style upon appliance of that paragraph
600 style.
601
602 @return outline level or NO_NUMBERING if there is no outline level
603 */
604 int GetAttrOutlineLevel() const;
605
606 /**
607 Sets the out line level *at* a text node.
608
609 @param nLevel the level to be set
610
611 If the text node has an outline number the level is set at the
612 outline number.
613
614 If the text node has no outline number but has a paragraph
615 style applied the outline level is set at the paragraph style.
616
617 NOTE: This is subject to change, see GetOutlineLevel.
618 */
619 void SetAttrOutlineLevel(int nLevel);
620
621 bool IsEmptyListStyleDueToSetOutlineLevelAttr();
622 void SetEmptyListStyleDueToSetOutlineLevelAttr();
623 void ResetEmptyListStyleDueToResetOutlineLevelAttr();
624
625
626 /**
627 Returns the width of leading tabs/blanks in this paragraph.
628 This space will be converted into numbering indent if the paragraph
629 is set to be numbered.
630
631 @return the width of the leading whitespace
632 */
633 sal_uInt16 GetWidthOfLeadingTabs() const;
634
635
636 /**
637 Returns if the paragraph has a visible numbering or bullet.
638 This includes all kinds of numbering/bullet/outlines.
639 Note: This function returns false, if the numbering format is
640 SVX_NUM_NUMBER_NONE or if the numbering/bullet has been deleted.
641
642 @return sal_True if the paragraph has a visible numbering/bullet/outline
643 */
644 bool HasVisibleNumberingOrBullet() const;
645
646 void SetListId( const String sListId );
647 String GetListId() const;
648
649 /** Determines, if the list level indent attributes can be applied to the
650 paragraph.
651
652 The list level indents can be applied to the paragraph under the one
653 of following conditions:
654 - the list style is directly applied to the paragraph and the paragraph
655 has no own indent attributes.
656 - the list style is applied to the paragraph through one of its paragraph
657 styles, the paragraph has no own indent attributes and on the paragraph
658 style hierarchy from the paragraph to the paragraph style with the
659 list style no indent attributes are found.
660
661 @author OD
662
663 @return boolean
664 */
665 bool AreListLevelIndentsApplicable() const;
666
667 /** Retrieves the list tab stop position, if the paragraph's list level defines
668 one and this list tab stop has to merged into the tap stops of the paragraph
669
670 @author OD
671
672 @param nListTabStopPosition
673 output parameter - containing the list tab stop position
674
675 @return boolean - indicating, if a list tab stop position is provided
676 */
677 bool GetListTabStopPosition( long& nListTabStopPosition ) const;
678
679 /** Retrieves the character following the list label, if the paragraph's
680 list level defines one.
681
682 @author OD
683
684 @return XubString - the list tab stop position
685 */
686 XubString GetLabelFollowedBy() const;
687
688 //
689 // END OF BULLET/NUMBERING/OUTLINE STUFF:
690 //
691
692 void fillSoftPageBreakList( SwSoftPageBreakList& rBreak ) const;
693
694 sal_uInt16 GetLang( const xub_StrLen nBegin, const xub_StrLen nLen = 0,
695 sal_uInt16 nScript = 0 ) const;
696
697 // steht in ndcopy.cxx
698 sal_Bool IsSymbol( const xub_StrLen nBegin ) const; // steht in itratr.cxx
699 virtual SwCntntNode* MakeCopy( SwDoc*, const SwNodeIndex& ) const;
700
701 // interaktive Trennung: wir finden den TxtFrm und rufen sein CalcHyph
702 sal_Bool Hyphenate( SwInterHyphInfo &rHyphInf );
703 void DelSoftHyph( const xub_StrLen nStart, const xub_StrLen nEnd );
704
705 // --> OD 2007-11-15 #i83479#
706 // add 4th optional parameter <bAddSpaceAfterListLabelStr> indicating,
707 // when <bWithNum = true> that a space is inserted after the string for
708 // the list label.
709 // add 5th optional parameter <bWithSpacesForLevel> indicating, if additional
710 // spaces are inserted in front of the expanded text string depending on
711 // the list level.
712 XubString GetExpandTxt( const xub_StrLen nIdx = 0,
713 const xub_StrLen nLen = STRING_LEN,
714 const bool bWithNum = false,
715 const bool bAddSpaceAfterListLabelStr = false,
716 const bool bWithSpacesForLevel = false ) const;
717 // <--
718 sal_Bool GetExpandTxt( SwTxtNode& rDestNd, const SwIndex* pDestIdx = 0,
719 xub_StrLen nIdx = 0, xub_StrLen nLen = STRING_LEN,
720 sal_Bool bWithNum = sal_False, sal_Bool bWithFtn = sal_True,
721 sal_Bool bReplaceTabsWithSpaces = sal_False ) const;
722
723 /*
724 *
725 */
726 const ModelToViewHelper::ConversionMap*
727 BuildConversionMap( rtl::OUString& rExpandText ) const;
728
729 XubString GetRedlineTxt( xub_StrLen nIdx = 0,
730 xub_StrLen nLen = STRING_LEN,
731 sal_Bool bExpandFlds = sal_False,
732 sal_Bool bWithNum = sal_False ) const;
733 //Liefert fuer die Initalfunktion tatsaechliche Anzahl der Initialzeichen
734 //bei nWishLen == 0 die des ersten Wortes
735 sal_uInt16 GetDropLen( sal_uInt16 nWishLen) const;
736
737 // Passes back info needed on the dropcap dimensions
738 bool GetDropSize(int& rFontHeight, int& rDropHeight, int& rDropDescent) const;
739
740 // Hidden Paragraph Field:
CalcHiddenParaField()741 inline bool CalcHiddenParaField()
742 { return m_pSwpHints ? m_pSwpHints->CalcHiddenParaField() : false; }
743 // set CalcVisible flags
SetCalcHiddenParaField()744 inline void SetCalcHiddenParaField()
745 { if (m_pSwpHints) m_pSwpHints->SetCalcHiddenParaField(); }
746
747 // is the paragraph visible?
HasHiddenParaField() const748 inline bool HasHiddenParaField() const
749 { return m_pSwpHints ? m_pSwpHints->HasHiddenParaField() : false; }
750
751 //
752 // Hidden Paragraph Field:
753 //
HasHiddenCharAttribute(bool bWholePara) const754 inline bool HasHiddenCharAttribute( bool bWholePara ) const
755 {
756 if ( m_bRecalcHiddenCharFlags )
757 CalcHiddenCharFlags();
758 return bWholePara ? m_bHiddenCharsHidePara : m_bContainsHiddenChars;
759 }
760
SetCalcHiddenCharFlags() const761 inline void SetCalcHiddenCharFlags() const
762 { m_bRecalcHiddenCharFlags = true; }
763
764 // --> FME 2004-06-08 #i12836# enhanced pdf
765 //
766 // Returns if the node is hidden due to
767 // 1. HiddenParaField
768 // 2. HiddenCharAttribute
769 // 3. HiddenSection
770 //
771 bool IsHidden() const;
772 // <--
773
774 TYPEINFO(); // fuer rtti
775
776 // override SwIndexReg
777 virtual void Update(
778 SwIndex const & rPos,
779 const xub_StrLen nChangeLen,
780 const bool bNegative = false,
781 const bool bDelete = false );
782
783 // change text to Upper/Lower/Hiragana/Katagana/...
784 void TransliterateText( utl::TransliterationWrapper& rTrans,
785 xub_StrLen nStart, xub_StrLen nEnd,
786 SwUndoTransliterate* pUndo = 0 );
787
788 // count words in given range
789 void CountWords( SwDocStat& rStat, xub_StrLen nStart, xub_StrLen nEnd ) const;
790
791 // Checks some global conditions like loading or destruction of document
792 // to economize notifications
793 bool IsNotificationEnabled() const;
794
795 // Checks a temporary notification blocker and the global conditions of IsNotificationEnabled()
796 bool IsNotifiable() const;
797
798 void SetListRestart( bool bRestart );
799 bool IsListRestart() const;
800
801 void SetAttrListRestartValue( SwNumberTree::tSwNumTreeNumber nNum );
802 bool HasAttrListRestartValue() const;
803 SwNumberTree::tSwNumTreeNumber GetAttrListRestartValue() const;
804 SwNumberTree::tSwNumTreeNumber GetActualListStartValue() const;
805
806 void SetCountedInList( bool bCounted );
807 bool IsCountedInList() const;
808
809 void AddToList();
810 void RemoveFromList();
811 bool IsInList() const;
812
813 bool IsFirstOfNumRule() const;
814
815 sal_uInt16 GetScalingOfSelectedText( xub_StrLen nStt, xub_StrLen nEnd ) const;
816
817 SW_DLLPRIVATE ::com::sun::star::uno::WeakReference<
GetXParagraph() const818 ::com::sun::star::text::XTextContent> const& GetXParagraph() const
819 { return m_wXParagraph; }
SetXParagraph(::com::sun::star::uno::Reference<::com::sun::star::text::XTextContent> const & xParagraph)820 SW_DLLPRIVATE void SetXParagraph(::com::sun::star::uno::Reference<
821 ::com::sun::star::text::XTextContent> const& xParagraph)
822 { m_wXParagraph = xParagraph; }
823
824 // sfx2::Metadatable
825 virtual ::sfx2::IXmlIdRegistry& GetRegistry();
826 virtual bool IsInClipboard() const;
827 virtual bool IsInUndo() const;
828 virtual bool IsInContent() const;
829 virtual ::com::sun::star::uno::Reference<
830 ::com::sun::star::rdf::XMetadatable > MakeUnoObject();
831
832 DECL_FIXEDMEMPOOL_NEWDEL(SwTxtNode)
833
834 //UUUU Access to DrawingLayer FillAttributes in a preprocessed form for primitive usage
835 virtual drawinglayer::attribute::SdrAllFillAttributesHelperPtr getSdrAllFillAttributesHelper() const;
836 };
837
838 //-----------------------------------------------------------------------------
839
GetSwpHints()840 inline SwpHints & SwTxtNode::GetSwpHints()
841 {
842 ASSERT_ID( m_pSwpHints, ERR_NOHINTS);
843 return *m_pSwpHints;
844 }
GetSwpHints() const845 inline const SwpHints &SwTxtNode::GetSwpHints() const
846 {
847 ASSERT_ID( m_pSwpHints, ERR_NOHINTS);
848 return *m_pSwpHints;
849 }
850
GetOrCreateSwpHints()851 inline SwpHints& SwTxtNode::GetOrCreateSwpHints()
852 {
853 if ( !m_pSwpHints )
854 {
855 m_pSwpHints = new SwpHints;
856 }
857 return *m_pSwpHints;
858 }
859
TryDeleteSwpHints()860 inline void SwTxtNode::TryDeleteSwpHints()
861 {
862 if ( m_pSwpHints && m_pSwpHints->CanBeDeleted() )
863 {
864 DELETEZ( m_pSwpHints );
865 }
866 }
867
GetTxtColl() const868 inline SwTxtFmtColl* SwTxtNode::GetTxtColl() const
869 {
870 return static_cast<SwTxtFmtColl*>(const_cast<SwModify*>(GetRegisteredIn()));
871 }
872
873 // fuer den IBM-Compiler nicht inlinen wg. 42876
874 #ifndef ICC
875 // Inline Methoden aus Node.hxx - erst hier ist der TxtNode bekannt !!
GetTxtNode()876 inline SwTxtNode *SwNode::GetTxtNode()
877 {
878 return ND_TEXTNODE == nNodeType ? static_cast<SwTxtNode*>(this) : 0;
879 }
GetTxtNode() const880 inline const SwTxtNode *SwNode::GetTxtNode() const
881 {
882 return ND_TEXTNODE == nNodeType ? static_cast<const SwTxtNode*>(this) : 0;
883 }
884 #endif
885
886 inline void
CutText(SwTxtNode * const pDest,const SwIndex & rDestStart,const SwIndex & rStart,const xub_StrLen nLen)887 SwTxtNode::CutText(SwTxtNode * const pDest, const SwIndex & rDestStart,
888 const SwIndex & rStart, const xub_StrLen nLen)
889 {
890 CutImpl( pDest, rDestStart, rStart, nLen, true );
891 }
892
893 #endif
894