xref: /AOO41X/main/sw/source/core/edit/autofmt.cxx (revision 8ef2f12b1aeba1404ab3c221e6e26281826cc4fc)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #define _SVSTDARR_LONGS
29cdf0e10cSrcweir #define _SVSTDARR_USHORTS
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <ctype.h>
32cdf0e10cSrcweir #include <hintids.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <svl/svstdarr.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <unotools/charclass.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #include <vcl/msgbox.hxx>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include <editeng/boxitem.hxx>
41cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
42cdf0e10cSrcweir #include <editeng/brkitem.hxx>
43cdf0e10cSrcweir #include <editeng/adjitem.hxx>
44cdf0e10cSrcweir #include <editeng/tstpitem.hxx>
45cdf0e10cSrcweir #include <editeng/fontitem.hxx>
46cdf0e10cSrcweir #include <editeng/langitem.hxx>
47cdf0e10cSrcweir #include <editeng/cscoitem.hxx>
48cdf0e10cSrcweir #include <editeng/unolingu.hxx>
49cdf0e10cSrcweir #include <editeng/acorrcfg.hxx>
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #include <swwait.hxx>
52cdf0e10cSrcweir #include <fmtpdsc.hxx>
53cdf0e10cSrcweir #include <fmtanchr.hxx>
54cdf0e10cSrcweir #include <doc.hxx>
55cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
56cdf0e10cSrcweir #include <docary.hxx>
57cdf0e10cSrcweir #include <editsh.hxx>
58cdf0e10cSrcweir #include <index.hxx>
59cdf0e10cSrcweir #include <pam.hxx>
60cdf0e10cSrcweir #include <edimp.hxx>
61cdf0e10cSrcweir #include <fesh.hxx>
62cdf0e10cSrcweir #include <swundo.hxx>		// fuer die UndoIds
63cdf0e10cSrcweir #include <poolfmt.hxx>
64cdf0e10cSrcweir #include <ndtxt.hxx>
65cdf0e10cSrcweir #include <txtfrm.hxx>
66cdf0e10cSrcweir #include <frminf.hxx>
67cdf0e10cSrcweir #include <pagedesc.hxx>
68cdf0e10cSrcweir #include <paratr.hxx>
69cdf0e10cSrcweir #include <swtable.hxx>
70cdf0e10cSrcweir #include <acorrect.hxx>
71cdf0e10cSrcweir #include <shellres.hxx>
72cdf0e10cSrcweir #include <section.hxx>
73cdf0e10cSrcweir #include <frmatr.hxx>
74cdf0e10cSrcweir #include <charatr.hxx>
75cdf0e10cSrcweir #include <mdiexp.hxx>
76cdf0e10cSrcweir #include <statstr.hrc>
77cdf0e10cSrcweir #include <comcore.hrc>
78cdf0e10cSrcweir #include <numrule.hxx>
79cdf0e10cSrcweir 
80cdf0e10cSrcweir using namespace ::com::sun::star;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir //-------------------------------------------------------------------
83cdf0e10cSrcweir 
84cdf0e10cSrcweir //JP 16.12.99: definition:
85cdf0e10cSrcweir //		from pos cPosEnDash to cPosEmDash all chars changed to endashes,
86cdf0e10cSrcweir //		from pos cPosEmDash to cPosEnd    all chars changed to emdashes
87cdf0e10cSrcweir // 		all other chars are changed to the user configuration
88cdf0e10cSrcweir 
89cdf0e10cSrcweir const sal_Unicode pBulletChar[6] = { '+', '*', '-', 0x2013, 0x2014, 0 };
90cdf0e10cSrcweir const int cnPosEnDash = 2, cnPosEmDash = 4, cnPosEnd = 5;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir const sal_Unicode cStarSymbolEnDash = 0x2013;
93cdf0e10cSrcweir const sal_Unicode cStarSymbolEmDash = 0x2014;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 
96cdf0e10cSrcweir SvxSwAutoFmtFlags* SwEditShell::pAutoFmtFlags = 0;
97cdf0e10cSrcweir 
98cdf0e10cSrcweir // Anzahl von Num-/Bullet-Absatzvorlagen. MAXLEVEL wird demnaechst auf
99cdf0e10cSrcweir // x erhoeht, die Anzahl Vorlagen aber nicht (Ueberbleibsel aus <= 4.0)
100cdf0e10cSrcweir const sal_uInt16 cnNumBullColls = 4;
101cdf0e10cSrcweir 
102cdf0e10cSrcweir class SwAutoFormat
103cdf0e10cSrcweir {
104cdf0e10cSrcweir 	SvxSwAutoFmtFlags aFlags;
105cdf0e10cSrcweir 	SwPaM aDelPam;				// ein Pam der benutzt werden kann
106cdf0e10cSrcweir 	SwNodeIndex aNdIdx;			// der Index auf den akt. TextNode
107cdf0e10cSrcweir 	SwNodeIndex aEndNdIdx;		// Index auf das Ende vom Bereich
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	SwEditShell* pEditShell;
110cdf0e10cSrcweir 	SwDoc* pDoc;
111cdf0e10cSrcweir 	SwTxtNode* pAktTxtNd;		// der akt. TextNode
112cdf0e10cSrcweir 	SwTxtFrm* pAktTxtFrm;		// Frame vom akt. TextNode
113cdf0e10cSrcweir 	CharClass* pCharClass;		// Character classification
114cdf0e10cSrcweir 	sal_uLong nEndNdIdx;			// fuer die Prozent-Anzeige
115cdf0e10cSrcweir 	LanguageType eCharClassLang;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	sal_uInt16 nLastHeadLvl, nLastCalcHeadLvl;
118cdf0e10cSrcweir 	sal_uInt16 nLastEnumLvl, nLastCalcEnumLvl;
119cdf0e10cSrcweir 	sal_uInt16 nRedlAutoFmtSeqId;
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 	enum
122cdf0e10cSrcweir 	{
123cdf0e10cSrcweir 		NONE = 0,
124cdf0e10cSrcweir 		DELIM = 1,
125cdf0e10cSrcweir 		DIGIT = 2,
126cdf0e10cSrcweir 		CHG = 4,
127cdf0e10cSrcweir 		LOWER_ALPHA = 8,
128cdf0e10cSrcweir 		UPPER_ALPHA = 16,
129cdf0e10cSrcweir 		LOWER_ROMAN = 32,
130cdf0e10cSrcweir 		UPPER_ROMAN = 64,
131cdf0e10cSrcweir 		NO_DELIM = (DIGIT|LOWER_ALPHA|UPPER_ALPHA|LOWER_ROMAN|UPPER_ROMAN)
132cdf0e10cSrcweir 	};
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	enum Format_Status
135cdf0e10cSrcweir 	{
136cdf0e10cSrcweir 		READ_NEXT_PARA,
137cdf0e10cSrcweir 		TST_EMPTY_LINE,
138cdf0e10cSrcweir 		TST_ALPHA_LINE,
139cdf0e10cSrcweir 		GET_ALL_INFO,
140cdf0e10cSrcweir 		IS_ONE_LINE,
141cdf0e10cSrcweir 		TST_ENUMERIC,
142cdf0e10cSrcweir 		TST_IDENT,
143cdf0e10cSrcweir 		TST_NEG_IDENT,
144cdf0e10cSrcweir 		TST_TXT_BODY,
145cdf0e10cSrcweir 		HAS_FMTCOLL,
146cdf0e10cSrcweir 		IS_ENDE
147cdf0e10cSrcweir 	} eStat;
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 	sal_Bool bEnde : 1;
150cdf0e10cSrcweir 	sal_Bool bEmptyLine : 1;
151cdf0e10cSrcweir 	sal_Bool bMoreLines : 1;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir     static sal_Bool  m_bAskForCancelUndoWhileBufferOverflow;
154cdf0e10cSrcweir     static short m_nActionWhileAutoformatUndoBufferOverflow;
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 	// ------------- private methods -----------------------------
158cdf0e10cSrcweir 	void _GetCharClass( LanguageType eLang );
GetCharClass(LanguageType eLang) const159cdf0e10cSrcweir 	CharClass& GetCharClass( LanguageType eLang ) const
160cdf0e10cSrcweir 	{
161cdf0e10cSrcweir 		if( !pCharClass || eLang != eCharClassLang )
162cdf0e10cSrcweir 		{
163cdf0e10cSrcweir 			SwAutoFormat* pThis = (SwAutoFormat*)this;
164cdf0e10cSrcweir 			pThis->_GetCharClass( eLang );
165cdf0e10cSrcweir 		}
166cdf0e10cSrcweir 		return *pCharClass;
167cdf0e10cSrcweir 	}
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 
IsSpace(const sal_Unicode c) const170cdf0e10cSrcweir 	sal_Bool IsSpace( const sal_Unicode c ) const
171cdf0e10cSrcweir 		{ return (' ' == c || '\t' == c || 0x0a == c|| 0x3000 == c /* Jap. space */) ? sal_True : sal_False; }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 	void SetColl( sal_uInt16 nId, sal_Bool bHdLineOrText = sal_False );
174cdf0e10cSrcweir 	String GoNextPara();
175cdf0e10cSrcweir 	sal_Bool HasObjects( const SwNode& rNd );
176cdf0e10cSrcweir 
177cdf0e10cSrcweir 	// TxtNode Methoden
178cdf0e10cSrcweir 	const SwTxtNode* GetNextNode() const;
IsEmptyLine(const SwTxtNode & rNd) const179cdf0e10cSrcweir 	sal_Bool IsEmptyLine( const SwTxtNode& rNd ) const
180cdf0e10cSrcweir 		{	return 0 == rNd.GetTxt().Len() ||
181cdf0e10cSrcweir 				rNd.GetTxt().Len() == GetLeadingBlanks( rNd.GetTxt() ); }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	sal_Bool IsOneLine( const SwTxtNode& ) const;
184cdf0e10cSrcweir 	sal_Bool IsFastFullLine( const SwTxtNode& ) const;
185cdf0e10cSrcweir 	sal_Bool IsNoAlphaLine( const SwTxtNode&) const;
186cdf0e10cSrcweir 	sal_Bool IsEnumericChar( const SwTxtNode&) const;
187cdf0e10cSrcweir 	sal_Bool IsBlanksInString( const SwTxtNode&) const;
188cdf0e10cSrcweir 	sal_uInt16 CalcLevel( const SwTxtNode&, sal_uInt16 *pDigitLvl = 0 ) const;
189cdf0e10cSrcweir 	xub_StrLen GetBigIndent( xub_StrLen& rAktSpacePos ) const;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 	String& DelLeadingBlanks( String& rStr ) const;
192cdf0e10cSrcweir 	String& DelTrailingBlanks( String& rStr ) const;
193cdf0e10cSrcweir 	xub_StrLen GetLeadingBlanks( const String& rStr ) const;
194cdf0e10cSrcweir 	xub_StrLen GetTrailingBlanks( const String& rStr ) const;
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 	sal_Bool IsFirstCharCapital( const SwTxtNode& rNd ) const;
197cdf0e10cSrcweir 	sal_uInt16 GetDigitLevel( const SwTxtNode& rTxtNd, xub_StrLen& rPos,
198cdf0e10cSrcweir 							String* pPreFix = 0, String* pPostFix = 0,
199cdf0e10cSrcweir 							String* pNumTypes = 0 ) const;
200cdf0e10cSrcweir 		// hole den FORMATIERTEN TextFrame
201cdf0e10cSrcweir 	SwTxtFrm* GetFrm( const SwTxtNode& rTxtNd ) const;
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 	void BuildIndent();
204cdf0e10cSrcweir 	void BuildText();
205cdf0e10cSrcweir 	void BuildTextIndent();
206cdf0e10cSrcweir 	void BuildEnum( sal_uInt16 nLvl, sal_uInt16 nDigitLevel );
207cdf0e10cSrcweir 	void BuildNegIndent( SwTwips nSpaces );
208cdf0e10cSrcweir 	void BuildHeadLine( sal_uInt16 nLvl );
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 	sal_Bool HasSelBlanks( SwPaM& rPam ) const;
211cdf0e10cSrcweir 	sal_Bool HasBreakAttr( const SwTxtNode& ) const;
212cdf0e10cSrcweir 	void DeleteSel( SwPaM& rPam );
213cdf0e10cSrcweir 	sal_Bool DeleteAktNxtPara( const String& rNxtPara );
214cdf0e10cSrcweir 	// loesche im Node Anfang oder/und Ende
215cdf0e10cSrcweir 	void DeleteAktPara( sal_Bool bStart = sal_True, sal_Bool nEnd = sal_True );
216cdf0e10cSrcweir 	void DelEmptyLine( sal_Bool bTstNextPara = sal_True );
217cdf0e10cSrcweir 		// loesche bei mehrzeiligen Absaetzen die "linken" und/oder
218cdf0e10cSrcweir 		// "rechten" Raender
219cdf0e10cSrcweir 	void DelMoreLinesBlanks( sal_Bool bWithLineBreaks = sal_False );
220cdf0e10cSrcweir 		// loesche den vorherigen Absatz
221cdf0e10cSrcweir 	void DelPrevPara();
222cdf0e10cSrcweir 		// dann lasse doch mal das AutoCorrect auf den akt. TextNode los
223cdf0e10cSrcweir 	void AutoCorrect( xub_StrLen nSttPos = 0 );
224cdf0e10cSrcweir 
CanJoin(const SwTxtNode * pTxtNd) const225cdf0e10cSrcweir 	sal_Bool CanJoin( const SwTxtNode* pTxtNd ) const
226cdf0e10cSrcweir 	{
227cdf0e10cSrcweir 		return !bEnde && pTxtNd &&
228cdf0e10cSrcweir 			 !IsEmptyLine( *pTxtNd ) &&
229cdf0e10cSrcweir 			 !IsNoAlphaLine( *pTxtNd) &&
230cdf0e10cSrcweir 			 !IsEnumericChar( *pTxtNd ) &&
231cdf0e10cSrcweir 			 ((STRING_MAXLEN - 50 - pTxtNd->GetTxt().Len()) >
232cdf0e10cSrcweir 					pAktTxtNd->GetTxt().Len()) &&
233cdf0e10cSrcweir 			 !HasBreakAttr( *pTxtNd );
234cdf0e10cSrcweir 	}
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 	// ist ein Punkt am Ende ??
237cdf0e10cSrcweir 	sal_Bool IsSentenceAtEnd( const SwTxtNode& rTxtNd ) const;
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 	sal_Bool DoUnderline();
240cdf0e10cSrcweir 	sal_Bool DoTable();
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 	void _SetRedlineTxt( sal_uInt16 nId );
SetRedlineTxt(sal_uInt16 nId)243cdf0e10cSrcweir 	sal_Bool SetRedlineTxt( sal_uInt16 nId )
244cdf0e10cSrcweir 		{ if( aFlags.bWithRedlining )	_SetRedlineTxt( nId );  return sal_True; }
ClearRedlineTxt()245cdf0e10cSrcweir 	sal_Bool ClearRedlineTxt()
246cdf0e10cSrcweir 		{ if( aFlags.bWithRedlining )	pDoc->SetAutoFmtRedlineComment(0);  return sal_True; }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir public:
249cdf0e10cSrcweir 	SwAutoFormat( SwEditShell* pEdShell, SvxSwAutoFmtFlags& rFlags,
250cdf0e10cSrcweir 				SwNodeIndex* pSttNd = 0, SwNodeIndex* pEndNd = 0 );
~SwAutoFormat()251cdf0e10cSrcweir 	~SwAutoFormat() {
252cdf0e10cSrcweir 		delete pCharClass;
253cdf0e10cSrcweir 	}
254cdf0e10cSrcweir };
255cdf0e10cSrcweir 
256cdf0e10cSrcweir sal_Bool  SwAutoFormat::m_bAskForCancelUndoWhileBufferOverflow     = sal_True;
257cdf0e10cSrcweir short SwAutoFormat::m_nActionWhileAutoformatUndoBufferOverflow = RET_YES;
258cdf0e10cSrcweir 
StrChr(const sal_Unicode * pSrc,sal_Unicode c)259cdf0e10cSrcweir const sal_Unicode* StrChr( const sal_Unicode* pSrc, sal_Unicode c )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir 	while( *pSrc && *pSrc != c )
262cdf0e10cSrcweir 		++pSrc;
263cdf0e10cSrcweir 	return *pSrc ? pSrc : 0;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
GetFrm(const SwTxtNode & rTxtNd) const266cdf0e10cSrcweir SwTxtFrm* SwAutoFormat::GetFrm( const SwTxtNode& rTxtNd ) const
267cdf0e10cSrcweir {
268cdf0e10cSrcweir 	// besorge mal den Frame
269cdf0e10cSrcweir 	const SwCntntFrm *pFrm = rTxtNd.getLayoutFrm( pEditShell->GetLayout() );
270cdf0e10cSrcweir 	ASSERT( pFrm, "zum Autoformat muss das Layout vorhanden sein" );
271cdf0e10cSrcweir 	if( aFlags.bAFmtByInput && !pFrm->IsValid() )
272cdf0e10cSrcweir 	{
273cdf0e10cSrcweir 		SwRect aTmpFrm( pFrm->Frm() );
274cdf0e10cSrcweir 		SwRect aTmpPrt( pFrm->Prt() );
275cdf0e10cSrcweir 		pFrm->Calc();
276cdf0e10cSrcweir 		if( pFrm->Frm() != aTmpFrm || pFrm->Prt() != aTmpPrt ||
277cdf0e10cSrcweir 			( pFrm->IsTxtFrm() && !((SwTxtFrm*)pFrm)->Paint().IsEmpty() ) )
278cdf0e10cSrcweir 			pFrm->SetCompletePaint();
279cdf0e10cSrcweir 	}
280cdf0e10cSrcweir 	return ((SwTxtFrm*)pFrm)->GetFormatted();
281cdf0e10cSrcweir }
282cdf0e10cSrcweir 
_GetCharClass(LanguageType eLang)283cdf0e10cSrcweir void SwAutoFormat::_GetCharClass( LanguageType eLang )
284cdf0e10cSrcweir {
285cdf0e10cSrcweir 	delete pCharClass;
286cdf0e10cSrcweir 	pCharClass = new CharClass( SvxCreateLocale( eLang ));
287cdf0e10cSrcweir 	eCharClassLang = eLang;
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
_SetRedlineTxt(sal_uInt16 nActionId)290cdf0e10cSrcweir void SwAutoFormat::_SetRedlineTxt( sal_uInt16 nActionId )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir 	String sTxt;
293cdf0e10cSrcweir 	sal_uInt16 nSeqNo = 0;
294cdf0e10cSrcweir 	if( STR_AUTOFMTREDL_END > nActionId )
295cdf0e10cSrcweir 	{
296cdf0e10cSrcweir 		sTxt = *ViewShell::GetShellRes()->GetAutoFmtNameLst()[ nActionId ];
297cdf0e10cSrcweir 		switch( nActionId )
298cdf0e10cSrcweir 		{
299cdf0e10cSrcweir 		case STR_AUTOFMTREDL_SET_NUMBULET:
300cdf0e10cSrcweir 		case STR_AUTOFMTREDL_DEL_MORELINES:
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 		// AutoCorrect-Actions
303cdf0e10cSrcweir 		case STR_AUTOFMTREDL_USE_REPLACE:
304cdf0e10cSrcweir 		case STR_AUTOFMTREDL_CPTL_STT_WORD:
305cdf0e10cSrcweir 		case STR_AUTOFMTREDL_CPTL_STT_SENT:
306cdf0e10cSrcweir 		case STR_AUTOFMTREDL_TYPO:
307cdf0e10cSrcweir 		case STR_AUTOFMTREDL_UNDER:
308cdf0e10cSrcweir 		case STR_AUTOFMTREDL_BOLD:
309cdf0e10cSrcweir 		case STR_AUTOFMTREDL_FRACTION:
310cdf0e10cSrcweir 		case STR_AUTOFMTREDL_DASH:
311cdf0e10cSrcweir 		case STR_AUTOFMTREDL_ORDINAL:
312cdf0e10cSrcweir         case STR_AUTOFMTREDL_NON_BREAK_SPACE:
313cdf0e10cSrcweir 			nSeqNo = ++nRedlAutoFmtSeqId;
314cdf0e10cSrcweir 			break;
315cdf0e10cSrcweir 		}
316cdf0e10cSrcweir 	}
317cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
318cdf0e10cSrcweir 	else
319cdf0e10cSrcweir 		sTxt = String::CreateFromAscii(
320cdf0e10cSrcweir 							RTL_CONSTASCII_STRINGPARAM( "Action-Text fehlt" ));
321cdf0e10cSrcweir #endif
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 	pDoc->SetAutoFmtRedlineComment( &sTxt, nSeqNo );
324cdf0e10cSrcweir }
325cdf0e10cSrcweir 
GoNextPara()326cdf0e10cSrcweir String SwAutoFormat::GoNextPara()
327cdf0e10cSrcweir {
328cdf0e10cSrcweir 	SwNode* pNewNd = 0;
329cdf0e10cSrcweir 	do {
330cdf0e10cSrcweir 		//has to be checed twice before and after incrementation
331cdf0e10cSrcweir 		if( aNdIdx.GetIndex() >= aEndNdIdx.GetIndex() )
332cdf0e10cSrcweir 		{
333cdf0e10cSrcweir 			bEnde = sal_True;
334cdf0e10cSrcweir 			return aEmptyStr;
335cdf0e10cSrcweir 		}
336cdf0e10cSrcweir 
337cdf0e10cSrcweir 		aNdIdx++;
338cdf0e10cSrcweir 		if( aNdIdx.GetIndex() >= aEndNdIdx.GetIndex() )
339cdf0e10cSrcweir 		{
340cdf0e10cSrcweir 			bEnde = sal_True;
341cdf0e10cSrcweir 			return aEmptyStr;
342cdf0e10cSrcweir 		}
343cdf0e10cSrcweir 		else
344cdf0e10cSrcweir 			pNewNd = &aNdIdx.GetNode();
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 		// kein TextNode ->
347cdf0e10cSrcweir 		// 		TableNode	: Tabelle ueberspringen
348cdf0e10cSrcweir 		// 		NoTxtNode	: Nodes ueberspringen
349cdf0e10cSrcweir 		// 		EndNode		: Ende erreicht, beenden
350cdf0e10cSrcweir 		if( pNewNd->IsEndNode() )
351cdf0e10cSrcweir 		{
352cdf0e10cSrcweir 			bEnde = sal_True;
353cdf0e10cSrcweir 			return aEmptyStr;
354cdf0e10cSrcweir 		}
355cdf0e10cSrcweir 		else if( pNewNd->IsTableNode() )
356cdf0e10cSrcweir 			aNdIdx = *pNewNd->EndOfSectionNode();
357cdf0e10cSrcweir 		else if( pNewNd->IsSectionNode() )
358cdf0e10cSrcweir 		{
359cdf0e10cSrcweir 			const SwSection& rSect = pNewNd->GetSectionNode()->GetSection();
360cdf0e10cSrcweir 			if( rSect.IsHiddenFlag() || rSect.IsProtectFlag() )
361cdf0e10cSrcweir 				aNdIdx = *pNewNd->EndOfSectionNode();
362cdf0e10cSrcweir 		}
363cdf0e10cSrcweir 	} while( !pNewNd->IsTxtNode() );
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 	if( !aFlags.bAFmtByInput )
366cdf0e10cSrcweir 		::SetProgressState( aNdIdx.GetIndex() + nEndNdIdx - aEndNdIdx.GetIndex(),
367cdf0e10cSrcweir 							pDoc->GetDocShell() );
368cdf0e10cSrcweir 
369cdf0e10cSrcweir 	pAktTxtNd = (SwTxtNode*)pNewNd;
370cdf0e10cSrcweir 	pAktTxtFrm = GetFrm( *pAktTxtNd );
371cdf0e10cSrcweir 	return pAktTxtNd->GetTxt();
372cdf0e10cSrcweir }
373cdf0e10cSrcweir 
HasObjects(const SwNode & rNd)374cdf0e10cSrcweir sal_Bool SwAutoFormat::HasObjects( const SwNode& rNd )
375cdf0e10cSrcweir {
376cdf0e10cSrcweir 	// haengt irgend etwas absatzgebundenes am Absatz?
377cdf0e10cSrcweir 	// z.B. Rahmen, DrawObjecte, ..
378cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
379cdf0e10cSrcweir 	const SwSpzFrmFmts& rFmts = *pDoc->GetSpzFrmFmts();
380cdf0e10cSrcweir 	for( sal_uInt16 n = 0; n < rFmts.Count(); ++n )
381cdf0e10cSrcweir 	{
382cdf0e10cSrcweir 		const SwFmtAnchor& rAnchor = rFmts[ n ]->GetAnchor();
383cdf0e10cSrcweir         if ((FLY_AT_PAGE != rAnchor.GetAnchorId()) &&
384cdf0e10cSrcweir 			rAnchor.GetCntntAnchor() &&
385cdf0e10cSrcweir 			&rAnchor.GetCntntAnchor()->nNode.GetNode() == &rNd )
386cdf0e10cSrcweir 		{
387cdf0e10cSrcweir 			bRet = sal_True;
388cdf0e10cSrcweir 			break;
389cdf0e10cSrcweir 		}
390cdf0e10cSrcweir 	}
391cdf0e10cSrcweir 	return bRet;
392cdf0e10cSrcweir }
393cdf0e10cSrcweir 
GetNextNode() const394cdf0e10cSrcweir const SwTxtNode* SwAutoFormat::GetNextNode() const
395cdf0e10cSrcweir {
396cdf0e10cSrcweir 	if( aNdIdx.GetIndex()+1 >= aEndNdIdx.GetIndex() )
397cdf0e10cSrcweir 		return 0;
398cdf0e10cSrcweir 	return pDoc->GetNodes()[ aNdIdx.GetIndex() + 1 ]->GetTxtNode();
399cdf0e10cSrcweir }
400cdf0e10cSrcweir 
401cdf0e10cSrcweir 
IsOneLine(const SwTxtNode & rNd) const402cdf0e10cSrcweir sal_Bool SwAutoFormat::IsOneLine( const SwTxtNode& rNd ) const
403cdf0e10cSrcweir {
404cdf0e10cSrcweir 	SwTxtFrmInfo aFInfo( GetFrm( rNd ) );
405cdf0e10cSrcweir 	return aFInfo.IsOneLine();
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 
IsFastFullLine(const SwTxtNode & rNd) const409cdf0e10cSrcweir sal_Bool SwAutoFormat::IsFastFullLine( const SwTxtNode& rNd ) const
410cdf0e10cSrcweir {
411cdf0e10cSrcweir 	sal_Bool bRet = aFlags.bRightMargin;
412cdf0e10cSrcweir 	if( bRet )
413cdf0e10cSrcweir 	{
414cdf0e10cSrcweir 		SwTxtFrmInfo aFInfo( GetFrm( rNd ) );
415cdf0e10cSrcweir 		bRet = aFInfo.IsFilled( aFlags.nRightMargin );
416cdf0e10cSrcweir 	}
417cdf0e10cSrcweir 	return bRet;
418cdf0e10cSrcweir }
419cdf0e10cSrcweir 
420cdf0e10cSrcweir 
IsEnumericChar(const SwTxtNode & rNd) const421cdf0e10cSrcweir sal_Bool SwAutoFormat::IsEnumericChar( const SwTxtNode& rNd ) const
422cdf0e10cSrcweir {
423cdf0e10cSrcweir 	const String& rTxt = rNd.GetTxt();
424cdf0e10cSrcweir 	String sTmp( rTxt );
425cdf0e10cSrcweir 	xub_StrLen nBlnks = GetLeadingBlanks( sTmp );
426cdf0e10cSrcweir 	xub_StrLen nLen = rTxt.Len() - nBlnks;
427cdf0e10cSrcweir 	if( !nLen )
428cdf0e10cSrcweir 		return sal_False;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir 	// -, +, * getrennt durch Blank ??
431cdf0e10cSrcweir 	if( 2 < nLen && IsSpace( rTxt.GetChar( nBlnks + 1 ) ) )
432cdf0e10cSrcweir 	{
433cdf0e10cSrcweir 		if( StrChr( pBulletChar, rTxt.GetChar( nBlnks ) ) )
434cdf0e10cSrcweir 			return sal_True;
435cdf0e10cSrcweir 		// sollte an der Position ein Symbolfont existieren ?
436cdf0e10cSrcweir 		SwTxtFrmInfo aFInfo( GetFrm( rNd ) );
437cdf0e10cSrcweir 		if( aFInfo.IsBullet( nBlnks ))
438cdf0e10cSrcweir 			return sal_True;
439cdf0e10cSrcweir 	}
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 	// 1.) / 1. / 1.1.1 / (1). / (1) / ....
442cdf0e10cSrcweir 	return USHRT_MAX != GetDigitLevel( rNd, nBlnks );
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 
IsBlanksInString(const SwTxtNode & rNd) const446cdf0e10cSrcweir sal_Bool SwAutoFormat::IsBlanksInString( const SwTxtNode& rNd ) const
447cdf0e10cSrcweir {
448cdf0e10cSrcweir 	// suche im String mehr als 5 Blanks/Tabs
449cdf0e10cSrcweir 	String sTmp( rNd.GetTxt() );
450cdf0e10cSrcweir 	DelTrailingBlanks( DelLeadingBlanks( sTmp ));
451cdf0e10cSrcweir 	const sal_Unicode* pTmp = sTmp.GetBuffer();
452cdf0e10cSrcweir 	while( *pTmp )
453cdf0e10cSrcweir 	{
454cdf0e10cSrcweir 		if( IsSpace( *pTmp ) )
455cdf0e10cSrcweir 		{
456cdf0e10cSrcweir 			if( IsSpace( *++pTmp ))		// 2 Space nach einander
457cdf0e10cSrcweir 			{
458cdf0e10cSrcweir 				const sal_Unicode* pStt = pTmp;
459cdf0e10cSrcweir 				while( *pTmp && IsSpace( *++pTmp ))
460cdf0e10cSrcweir 					;
461cdf0e10cSrcweir 				if( 5 <= pTmp - pStt )
462cdf0e10cSrcweir 					return sal_True;
463cdf0e10cSrcweir 			}
464cdf0e10cSrcweir 			else
465cdf0e10cSrcweir 				++pTmp;
466cdf0e10cSrcweir 		}
467cdf0e10cSrcweir 		else
468cdf0e10cSrcweir 			++pTmp;
469cdf0e10cSrcweir 	}
470cdf0e10cSrcweir 	return sal_False;
471cdf0e10cSrcweir }
472cdf0e10cSrcweir 
473cdf0e10cSrcweir 
CalcLevel(const SwTxtNode & rNd,sal_uInt16 * pDigitLvl) const474cdf0e10cSrcweir sal_uInt16 SwAutoFormat::CalcLevel( const SwTxtNode& rNd, sal_uInt16 *pDigitLvl ) const
475cdf0e10cSrcweir {
476cdf0e10cSrcweir 	sal_uInt16 nLvl = 0, nBlnk = 0;
477cdf0e10cSrcweir 	const String& rTxt = rNd.GetTxt();
478cdf0e10cSrcweir 	if( pDigitLvl )
479cdf0e10cSrcweir 		*pDigitLvl = USHRT_MAX;
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 	if( RES_POOLCOLL_TEXT_MOVE == rNd.GetTxtColl()->GetPoolFmtId() )
482cdf0e10cSrcweir 	{
483cdf0e10cSrcweir 		if( aFlags.bAFmtByInput )
484cdf0e10cSrcweir 		{
485cdf0e10cSrcweir 			nLvl = rNd.GetAutoFmtLvl();
486cdf0e10cSrcweir 			((SwTxtNode&)rNd).SetAutoFmtLvl( 0 );
487cdf0e10cSrcweir 			if( nLvl )
488cdf0e10cSrcweir 				return nLvl;
489cdf0e10cSrcweir 		}
490cdf0e10cSrcweir 		++nLvl;
491cdf0e10cSrcweir 	}
492cdf0e10cSrcweir 
493cdf0e10cSrcweir 
494cdf0e10cSrcweir 	for( xub_StrLen n = 0, nEnd = rTxt.Len(); n < nEnd; ++n )
495cdf0e10cSrcweir 	{
496cdf0e10cSrcweir 		switch( rTxt.GetChar( n ) )
497cdf0e10cSrcweir 		{
498cdf0e10cSrcweir 		case ' ': 	if( 3 == ++nBlnk )
499cdf0e10cSrcweir 						++nLvl, nBlnk = 0;
500cdf0e10cSrcweir 					break;
501cdf0e10cSrcweir 		case '\t':	++nLvl, nBlnk = 0;
502cdf0e10cSrcweir 					break;
503cdf0e10cSrcweir 		default:
504cdf0e10cSrcweir 			if( pDigitLvl )
505cdf0e10cSrcweir 				// Teste auf 1.) / 1. / 1.1.1 / (1). / (1) / ....
506cdf0e10cSrcweir 				*pDigitLvl = GetDigitLevel( rNd, n );
507cdf0e10cSrcweir 			return nLvl;
508cdf0e10cSrcweir 		}
509cdf0e10cSrcweir 	}
510cdf0e10cSrcweir 	return nLvl;
511cdf0e10cSrcweir }
512cdf0e10cSrcweir 
513cdf0e10cSrcweir 
514cdf0e10cSrcweir 
GetBigIndent(xub_StrLen & rAktSpacePos) const515cdf0e10cSrcweir xub_StrLen SwAutoFormat::GetBigIndent( xub_StrLen& rAktSpacePos ) const
516cdf0e10cSrcweir {
517cdf0e10cSrcweir 	SwTxtFrmInfo aFInfo( GetFrm( *pAktTxtNd ) );
518cdf0e10cSrcweir 	const SwTxtFrm* pNxtFrm = 0;
519cdf0e10cSrcweir 
520cdf0e10cSrcweir 	if( !bMoreLines )
521cdf0e10cSrcweir 	{
522cdf0e10cSrcweir 		const SwTxtNode* pNxtNd = GetNextNode();
523cdf0e10cSrcweir 		if( !CanJoin( pNxtNd ) || !IsOneLine( *pNxtNd ) )
524cdf0e10cSrcweir 			return 0;
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 		pNxtFrm = GetFrm( *pNxtNd );
527cdf0e10cSrcweir 	}
528cdf0e10cSrcweir 
529cdf0e10cSrcweir 	return aFInfo.GetBigIndent( rAktSpacePos, pNxtFrm );
530cdf0e10cSrcweir }
531cdf0e10cSrcweir 
532cdf0e10cSrcweir 
IsNoAlphaLine(const SwTxtNode & rNd) const533cdf0e10cSrcweir sal_Bool SwAutoFormat::IsNoAlphaLine( const SwTxtNode& rNd ) const
534cdf0e10cSrcweir {
535cdf0e10cSrcweir 	const String& rStr = rNd.GetTxt();
536cdf0e10cSrcweir 	if( !rStr.Len() )
537cdf0e10cSrcweir 		return sal_False;
538cdf0e10cSrcweir 	// oder besser: ueber die Anzahl von Alpha/Num- und !AN-Zeichen
539cdf0e10cSrcweir 	//				bestimmen.
540cdf0e10cSrcweir 	xub_StrLen nANChar = 0, nBlnk = 0;
541cdf0e10cSrcweir 
542cdf0e10cSrcweir 	CharClass& rCC = GetCharClass( rNd.GetSwAttrSet().GetLanguage().GetLanguage() );
543cdf0e10cSrcweir 	for( xub_StrLen n = 0, nEnd = rStr.Len(); n < nEnd; ++n )
544cdf0e10cSrcweir 		if( IsSpace( rStr.GetChar( n ) ) )
545cdf0e10cSrcweir 			++nBlnk;
546cdf0e10cSrcweir 		else if( rCC.isLetterNumeric( rStr, n ))
547cdf0e10cSrcweir 			++nANChar;
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 	// sind zu 75% keine Alpha-Nummerische-Zeichen, dann sal_True
550cdf0e10cSrcweir 	sal_uLong nLen = rStr.Len() - nBlnk;
551cdf0e10cSrcweir 	nLen = ( nLen * 3 ) / 4;		    // long overflow, if the strlen > sal_uInt16
552cdf0e10cSrcweir 	return xub_StrLen(nLen) < (rStr.Len() - nANChar - nBlnk);
553cdf0e10cSrcweir }
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 
556cdf0e10cSrcweir 
DoUnderline()557cdf0e10cSrcweir sal_Bool SwAutoFormat::DoUnderline()
558cdf0e10cSrcweir {
559cdf0e10cSrcweir 	if( !aFlags.bSetBorder )
560cdf0e10cSrcweir 		return sal_False;
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 	const sal_Unicode* pStr = pAktTxtNd->GetTxt().GetBuffer();
563cdf0e10cSrcweir 	int eState = 0;
564cdf0e10cSrcweir 	xub_StrLen nCnt = 0;
565cdf0e10cSrcweir 	while( *pStr )
566cdf0e10cSrcweir 	{
567cdf0e10cSrcweir //JP 29.03.96: Spaces unterbrechen die Umrandung!
568cdf0e10cSrcweir //		if( !IsSpace( *pStr ) )
569cdf0e10cSrcweir 		{
570cdf0e10cSrcweir 			int eTmp = 0;
571cdf0e10cSrcweir 			switch( *pStr )
572cdf0e10cSrcweir 			{
573cdf0e10cSrcweir 			case '-': eTmp = 1;	break;
574cdf0e10cSrcweir 			case '_': eTmp = 2;	break;
575cdf0e10cSrcweir 			case '=': eTmp = 3;	break;
576cdf0e10cSrcweir 			case '*': eTmp = 4;	break;
577cdf0e10cSrcweir 			case '~': eTmp = 5;	break;
578cdf0e10cSrcweir 			case '#': eTmp = 6;	break;
579cdf0e10cSrcweir 			default:
580cdf0e10cSrcweir 				return sal_False;
581cdf0e10cSrcweir 			}
582cdf0e10cSrcweir 			if( 0 == eState )
583cdf0e10cSrcweir 				eState = eTmp;
584cdf0e10cSrcweir 			else if( eState != eTmp )
585cdf0e10cSrcweir 				return sal_False;
586cdf0e10cSrcweir 			++nCnt;
587cdf0e10cSrcweir 		}
588cdf0e10cSrcweir 		++pStr;
589cdf0e10cSrcweir 	}
590cdf0e10cSrcweir 
591cdf0e10cSrcweir 	if( 2 < nCnt )
592cdf0e10cSrcweir 	{
593cdf0e10cSrcweir 		// dann unterstreiche mal den vorherigen Absatz, wenn es diesen gibt!
594cdf0e10cSrcweir 		DelEmptyLine( sal_False );
595cdf0e10cSrcweir 		aDelPam.SetMark();
596cdf0e10cSrcweir 		aDelPam.GetMark()->nContent = 0;
597cdf0e10cSrcweir //JP 19.03.96: kein Underline sondern eine Umrandung setzen!
598cdf0e10cSrcweir //		pDoc->Insert( aDelPam, SvxUnderlineItem( eState ) );
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 		SvxBorderLine aLine;
601cdf0e10cSrcweir 		switch( eState )
602cdf0e10cSrcweir 		{
603cdf0e10cSrcweir 		case 1:			// einfach, 0,05 pt
604cdf0e10cSrcweir 			aLine.SetOutWidth( DEF_LINE_WIDTH_0 );
605cdf0e10cSrcweir 			break;
606cdf0e10cSrcweir 		case 2:			// einfach, 1,0 pt
607cdf0e10cSrcweir 			aLine.SetOutWidth( DEF_LINE_WIDTH_1 );
608cdf0e10cSrcweir 			break;
609cdf0e10cSrcweir 		case 3:			// doppelt, 1,1 pt
610cdf0e10cSrcweir 			aLine.SetOutWidth( DEF_DOUBLE_LINE0_OUT );
611cdf0e10cSrcweir 			aLine.SetInWidth( DEF_DOUBLE_LINE0_IN );
612cdf0e10cSrcweir 			aLine.SetDistance( DEF_DOUBLE_LINE0_DIST );
613cdf0e10cSrcweir 			break;
614cdf0e10cSrcweir 		case 4:			// doppelt, 4,5 pt
615cdf0e10cSrcweir 			aLine.SetOutWidth( DEF_DOUBLE_LINE4_OUT );
616cdf0e10cSrcweir 			aLine.SetInWidth( DEF_DOUBLE_LINE4_IN );
617cdf0e10cSrcweir 			aLine.SetDistance( DEF_DOUBLE_LINE4_DIST );
618cdf0e10cSrcweir 			break;
619cdf0e10cSrcweir 		case 5:			// doppelt, 6,0 pt
620cdf0e10cSrcweir 			aLine.SetOutWidth( DEF_DOUBLE_LINE5_OUT );
621cdf0e10cSrcweir 			aLine.SetInWidth( DEF_DOUBLE_LINE5_IN );
622cdf0e10cSrcweir 			aLine.SetDistance( DEF_DOUBLE_LINE5_DIST );
623cdf0e10cSrcweir 			break;
624cdf0e10cSrcweir 		case 6:			// doppelt, 9,0 pt
625cdf0e10cSrcweir 			aLine.SetOutWidth( DEF_DOUBLE_LINE6_OUT );
626cdf0e10cSrcweir 			aLine.SetInWidth( DEF_DOUBLE_LINE6_IN );
627cdf0e10cSrcweir 			aLine.SetDistance( DEF_DOUBLE_LINE6_DIST );
628cdf0e10cSrcweir 			break;
629cdf0e10cSrcweir 		}
630cdf0e10cSrcweir         SfxItemSet aSet(pDoc->GetAttrPool(),
631cdf0e10cSrcweir                     RES_PARATR_CONNECT_BORDER, RES_PARATR_CONNECT_BORDER,
632cdf0e10cSrcweir                     RES_BOX, RES_BOX,
633cdf0e10cSrcweir                     0);
634cdf0e10cSrcweir         aSet.Put( SwParaConnectBorderItem( sal_False ) );
635cdf0e10cSrcweir         SvxBoxItem aBox( RES_BOX );
636cdf0e10cSrcweir 		aBox.SetLine( &aLine, BOX_LINE_BOTTOM );
637cdf0e10cSrcweir 		aBox.SetDistance( 42 );		// ~0,75 mm
638cdf0e10cSrcweir         aSet.Put(aBox);
639cdf0e10cSrcweir         pDoc->InsertItemSet( aDelPam, aSet, 0 );
640cdf0e10cSrcweir 
641cdf0e10cSrcweir 		aDelPam.DeleteMark();
642cdf0e10cSrcweir 	}
643cdf0e10cSrcweir 	return 2 < nCnt;
644cdf0e10cSrcweir }
645cdf0e10cSrcweir 
646cdf0e10cSrcweir 
DoTable()647cdf0e10cSrcweir sal_Bool SwAutoFormat::DoTable()
648cdf0e10cSrcweir {
649cdf0e10cSrcweir 	if( !aFlags.bCreateTable || !aFlags.bAFmtByInput ||
650cdf0e10cSrcweir 		pAktTxtNd->FindTableNode() )
651cdf0e10cSrcweir 		return sal_False;
652cdf0e10cSrcweir 
653cdf0e10cSrcweir 	const String& rTmp = pAktTxtNd->GetTxt();
654cdf0e10cSrcweir 	xub_StrLen nSttPlus = GetLeadingBlanks( rTmp );
655cdf0e10cSrcweir 	xub_StrLen nEndPlus = GetTrailingBlanks( rTmp );
656cdf0e10cSrcweir 	sal_Unicode cChar;
657cdf0e10cSrcweir 
658cdf0e10cSrcweir 	if( 2 > nEndPlus - nSttPlus ||
659cdf0e10cSrcweir 		( '+' != ( cChar = rTmp.GetChar( nSttPlus )) && '|' != cChar ) ||
660cdf0e10cSrcweir 		( '+' != ( cChar = rTmp.GetChar( nEndPlus - 1)) && '|' != cChar ))
661cdf0e10cSrcweir 		return sal_False;
662cdf0e10cSrcweir 
663cdf0e10cSrcweir 	SwTxtFrmInfo aInfo( pAktTxtFrm );
664cdf0e10cSrcweir 
665cdf0e10cSrcweir 	xub_StrLen n = nSttPlus;
666cdf0e10cSrcweir 	const sal_Unicode* pStr = rTmp.GetBuffer() + n;
667cdf0e10cSrcweir 	SvUShorts aPosArr( 5, 5 );
668cdf0e10cSrcweir 
669cdf0e10cSrcweir 	while( *pStr )
670cdf0e10cSrcweir 	{
671cdf0e10cSrcweir 		switch( *pStr )
672cdf0e10cSrcweir 		{
673cdf0e10cSrcweir 		case '-':
674cdf0e10cSrcweir 		case '_':
675cdf0e10cSrcweir 		case '=':
676cdf0e10cSrcweir 		case ' ':
677cdf0e10cSrcweir 		case '\t':
678cdf0e10cSrcweir 			break;
679cdf0e10cSrcweir 
680cdf0e10cSrcweir 		case '+':
681cdf0e10cSrcweir 		case '|':
682cdf0e10cSrcweir 			aPosArr.Insert( static_cast<sal_uInt16>(aInfo.GetCharPos(n)), aPosArr.Count() );
683cdf0e10cSrcweir 			break;
684cdf0e10cSrcweir 
685cdf0e10cSrcweir 		default:
686cdf0e10cSrcweir 			return sal_False;
687cdf0e10cSrcweir 		}
688cdf0e10cSrcweir 		if( ++n == nEndPlus )
689cdf0e10cSrcweir 			break;
690cdf0e10cSrcweir 
691cdf0e10cSrcweir 		++pStr;
692cdf0e10cSrcweir 	}
693cdf0e10cSrcweir 
694cdf0e10cSrcweir 	if( 1 < aPosArr.Count() )
695cdf0e10cSrcweir 	{
696cdf0e10cSrcweir 		// Ausrichtung vom Textnode besorgen:
697cdf0e10cSrcweir 		sal_uInt16 nColCnt = aPosArr.Count() - 1;
698cdf0e10cSrcweir 		SwTwips nSttPos = aPosArr[ 0 ];
699cdf0e10cSrcweir         sal_Int16 eHori;
700cdf0e10cSrcweir 		switch( pAktTxtNd->GetSwAttrSet().GetAdjust().GetAdjust() )
701cdf0e10cSrcweir 		{
702cdf0e10cSrcweir         case SVX_ADJUST_CENTER:     eHori = text::HoriOrientation::CENTER;    break;
703cdf0e10cSrcweir         case SVX_ADJUST_RIGHT:      eHori = text::HoriOrientation::RIGHT;     break;
704cdf0e10cSrcweir 
705cdf0e10cSrcweir 		default:
706cdf0e10cSrcweir 			if( nSttPos )
707cdf0e10cSrcweir 			{
708cdf0e10cSrcweir                 eHori = text::HoriOrientation::NONE;
709cdf0e10cSrcweir 				// dann muss als letztes noch die akt. FrameBreite
710cdf0e10cSrcweir 				// ins Array
711cdf0e10cSrcweir 				aPosArr.Insert( static_cast<sal_uInt16>(pAktTxtFrm->Frm().Width()), aPosArr.Count() );
712cdf0e10cSrcweir 			}
713cdf0e10cSrcweir 			else
714cdf0e10cSrcweir                 eHori = text::HoriOrientation::LEFT;
715cdf0e10cSrcweir 			break;
716cdf0e10cSrcweir 		}
717cdf0e10cSrcweir 
718cdf0e10cSrcweir 		// dann erzeuge eine Tabelle, die den Zeichen entspricht
719cdf0e10cSrcweir 		DelEmptyLine();
720cdf0e10cSrcweir 		SwNodeIndex aIdx( aDelPam.GetPoint()->nNode );
721cdf0e10cSrcweir 		aDelPam.Move( fnMoveForward );
722cdf0e10cSrcweir         pDoc->InsertTable( SwInsertTableOptions( tabopts::ALL_TBL_INS_ATTR , 1 ),
723cdf0e10cSrcweir                            *aDelPam.GetPoint(), 1, nColCnt, eHori,
724cdf0e10cSrcweir                            0, &aPosArr );
725cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode = aIdx;
726cdf0e10cSrcweir 	}
727cdf0e10cSrcweir 	return 1 < aPosArr.Count();
728cdf0e10cSrcweir }
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 
DelLeadingBlanks(String & rStr) const731cdf0e10cSrcweir String& SwAutoFormat::DelLeadingBlanks( String& rStr ) const
732cdf0e10cSrcweir {
733cdf0e10cSrcweir 	xub_StrLen nL;
734cdf0e10cSrcweir 	xub_StrLen n;
735cdf0e10cSrcweir 
736cdf0e10cSrcweir 	for( nL = rStr.Len(), n = 0; n < nL && IsSpace( rStr.GetChar(n) ); ++n )
737cdf0e10cSrcweir 		;
738cdf0e10cSrcweir 	if( n )		// keine Spaces
739cdf0e10cSrcweir 		rStr.Erase( 0, n );
740cdf0e10cSrcweir 	return rStr;
741cdf0e10cSrcweir }
742cdf0e10cSrcweir 
743cdf0e10cSrcweir 
DelTrailingBlanks(String & rStr) const744cdf0e10cSrcweir String& SwAutoFormat::DelTrailingBlanks( String& rStr ) const
745cdf0e10cSrcweir {
746cdf0e10cSrcweir 	xub_StrLen nL = rStr.Len(), n = nL;
747cdf0e10cSrcweir 	if( !nL )
748cdf0e10cSrcweir 		return rStr;
749cdf0e10cSrcweir 
750cdf0e10cSrcweir 	while( --n && IsSpace( rStr.GetChar( n ) )  )
751cdf0e10cSrcweir 		;
752cdf0e10cSrcweir 	if( n+1 != nL )		// keine Spaces
753cdf0e10cSrcweir 		rStr.Erase( n+1 );
754cdf0e10cSrcweir 	return rStr;
755cdf0e10cSrcweir }
756cdf0e10cSrcweir 
757cdf0e10cSrcweir 
GetLeadingBlanks(const String & rStr) const758cdf0e10cSrcweir xub_StrLen SwAutoFormat::GetLeadingBlanks( const String& rStr ) const
759cdf0e10cSrcweir {
760cdf0e10cSrcweir 	xub_StrLen nL;
761cdf0e10cSrcweir 	xub_StrLen n;
762cdf0e10cSrcweir 
763cdf0e10cSrcweir 	for( nL = rStr.Len(), n = 0; n < nL && IsSpace( rStr.GetChar( n ) ); ++n )
764cdf0e10cSrcweir 		;
765cdf0e10cSrcweir 	return n;
766cdf0e10cSrcweir }
767cdf0e10cSrcweir 
768cdf0e10cSrcweir 
GetTrailingBlanks(const String & rStr) const769cdf0e10cSrcweir xub_StrLen SwAutoFormat::GetTrailingBlanks( const String& rStr ) const
770cdf0e10cSrcweir {
771cdf0e10cSrcweir 	xub_StrLen nL = rStr.Len(), n = nL;
772cdf0e10cSrcweir 	if( !nL )
773cdf0e10cSrcweir 		return 0;
774cdf0e10cSrcweir 
775cdf0e10cSrcweir 	while( --n && IsSpace( rStr.GetChar( n ) )  )
776cdf0e10cSrcweir 		;
777cdf0e10cSrcweir 	return ++n;
778cdf0e10cSrcweir }
779cdf0e10cSrcweir 
780cdf0e10cSrcweir 
IsFirstCharCapital(const SwTxtNode & rNd) const781cdf0e10cSrcweir sal_Bool SwAutoFormat::IsFirstCharCapital( const SwTxtNode& rNd ) const
782cdf0e10cSrcweir {
783cdf0e10cSrcweir 	const String& rTxt = rNd.GetTxt();
784cdf0e10cSrcweir 	for( xub_StrLen n = 0, nEnd = rTxt.Len(); n < nEnd; ++n )
785cdf0e10cSrcweir 		if( !IsSpace( rTxt.GetChar( n ) ) )
786cdf0e10cSrcweir 		{
787cdf0e10cSrcweir 			CharClass& rCC = GetCharClass( rNd.GetSwAttrSet().
788cdf0e10cSrcweir 										GetLanguage().GetLanguage() );
789cdf0e10cSrcweir 			sal_Int32 nCharType = rCC.getCharacterType( rTxt, n );
790cdf0e10cSrcweir 			return CharClass::isLetterType( nCharType ) &&
791cdf0e10cSrcweir                    0 != ( i18n::KCharacterType::UPPER &
792cdf0e10cSrcweir 													nCharType );
793cdf0e10cSrcweir 		}
794cdf0e10cSrcweir 	return sal_False;
795cdf0e10cSrcweir }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir 
GetDigitLevel(const SwTxtNode & rNd,xub_StrLen & rPos,String * pPreFix,String * pPostFix,String * pNumTypes) const798cdf0e10cSrcweir sal_uInt16 SwAutoFormat::GetDigitLevel( const SwTxtNode& rNd, xub_StrLen& rPos,
799cdf0e10cSrcweir 		String* pPreFix, String* pPostFix, String* pNumTypes ) const
800cdf0e10cSrcweir {
801cdf0e10cSrcweir 	// Teste auf 1.) / 1. / 1.1.1 / (1). / (1) / ....
802cdf0e10cSrcweir 	const String& rTxt = rNd.GetTxt();
803cdf0e10cSrcweir 	xub_StrLen nPos = rPos;
804cdf0e10cSrcweir 	int eScan = NONE;
805cdf0e10cSrcweir 
806cdf0e10cSrcweir 	sal_uInt16 nStart = 0;
807cdf0e10cSrcweir 	sal_uInt8 nDigitLvl = 0, nDigitCnt = 0;
808cdf0e10cSrcweir 	//count number of parenthesis to assure a sensible order is found
809cdf0e10cSrcweir 	sal_uInt16 nOpeningParentheses = 0;
810cdf0e10cSrcweir 	sal_uInt16 nClosingParentheses = 0;
811cdf0e10cSrcweir 
812cdf0e10cSrcweir 	CharClass& rCC = GetCharClass( rNd.GetSwAttrSet().GetLanguage().GetLanguage() );
813cdf0e10cSrcweir 
814cdf0e10cSrcweir 	while( nPos < rTxt.Len() && nDigitLvl < MAXLEVEL - 1)
815cdf0e10cSrcweir 	{
816cdf0e10cSrcweir 		const sal_Unicode cCurrentChar = rTxt.GetChar( nPos );
817cdf0e10cSrcweir 		if( ('0' <= cCurrentChar &&  '9' >= cCurrentChar) ||
818cdf0e10cSrcweir             (0xff10 <= cCurrentChar &&  0xff19 >= cCurrentChar) )
819cdf0e10cSrcweir 		{
820cdf0e10cSrcweir 			if( eScan & DELIM )
821cdf0e10cSrcweir 			{
822cdf0e10cSrcweir 				if( eScan & CHG )		// nicht wenns mit einer Zahl beginnt
823cdf0e10cSrcweir 				{
824cdf0e10cSrcweir 					++nDigitLvl;
825cdf0e10cSrcweir 					if( pPostFix )
826cdf0e10cSrcweir 						*pPostFix += (sal_Unicode)1;
827cdf0e10cSrcweir 				}
828cdf0e10cSrcweir 
829cdf0e10cSrcweir 				if( pNumTypes )
830cdf0e10cSrcweir 					*pNumTypes += (sal_Unicode)('0' + SVX_NUM_ARABIC);
831cdf0e10cSrcweir 
832cdf0e10cSrcweir 				eScan = eScan | CHG;
833cdf0e10cSrcweir 			}
834cdf0e10cSrcweir 			else if( pNumTypes && !(eScan & DIGIT) )
835cdf0e10cSrcweir 				*pNumTypes += (sal_Unicode)('0' + SVX_NUM_ARABIC);
836cdf0e10cSrcweir 
837cdf0e10cSrcweir 			eScan &= ~DELIM;		// Delim raus
838cdf0e10cSrcweir 			if( 0 != (eScan & ~CHG) && DIGIT != (eScan & ~CHG))
839cdf0e10cSrcweir 				return USHRT_MAX;
840cdf0e10cSrcweir 
841cdf0e10cSrcweir 			eScan |= DIGIT;			// Digit rein
842cdf0e10cSrcweir 			if( 3 == ++nDigitCnt )	// mehr als 2 Nummern sind kein Enum mehr
843cdf0e10cSrcweir 				return USHRT_MAX;
844cdf0e10cSrcweir 
845cdf0e10cSrcweir 			nStart *= 10;
846cdf0e10cSrcweir             nStart += cCurrentChar <= '9' ? cCurrentChar - '0' : cCurrentChar - 0xff10;
847cdf0e10cSrcweir 		}
848cdf0e10cSrcweir 		else if( rCC.isAlpha( rTxt, nPos ) )
849cdf0e10cSrcweir 		{
850cdf0e10cSrcweir 			sal_Bool bIsUpper =
851cdf0e10cSrcweir                 0 != ( i18n::KCharacterType::UPPER &
852cdf0e10cSrcweir 										rCC.getCharacterType( rTxt, nPos ));
853cdf0e10cSrcweir 			sal_Unicode cLow = rCC.toLower( rTxt, nPos, 1 ).GetChar(0), cNumTyp;
854cdf0e10cSrcweir 			int eTmpScan;
855cdf0e10cSrcweir 
856cdf0e10cSrcweir 			// roemische Zeichen sind "mdclxvi". Da man aber eher mal eine
857cdf0e10cSrcweir 			// Numerierung mit c oder d anfangen will, werden diese erstmal
858cdf0e10cSrcweir 			// zu chars und spaeter ggfs. zu romischen Zeichen!
859cdf0e10cSrcweir //			if( strchr( "mdclxvi", cLow ))
860cdf0e10cSrcweir #ifdef WITH_ALPHANUM_AS_NUMFMT
861cdf0e10cSrcweir 			//detection of 'c' and 'd' a ROMAN numbering should not be done here
862cdf0e10cSrcweir 			if( 256 > cLow  &&( (eScan & (LOWER_ROMAN|UPPER_ROMAN))
863cdf0e10cSrcweir 									? strchr( "mdclxvi", cLow )
864cdf0e10cSrcweir 									: strchr( "mlxvi", cLow ) ))
865cdf0e10cSrcweir #else
866cdf0e10cSrcweir 			if( 256 > cLow  && ( strchr( "mdclxvi", cLow ) ))
867cdf0e10cSrcweir #endif
868cdf0e10cSrcweir 			{
869cdf0e10cSrcweir 				if( bIsUpper )
870cdf0e10cSrcweir 					cNumTyp = '0' + SVX_NUM_ROMAN_UPPER, eTmpScan = UPPER_ROMAN;
871cdf0e10cSrcweir 				else
872cdf0e10cSrcweir 					cNumTyp = '0' + SVX_NUM_ROMAN_LOWER, eTmpScan = LOWER_ROMAN;
873cdf0e10cSrcweir 			}
874cdf0e10cSrcweir 			else if( bIsUpper )
875cdf0e10cSrcweir 				cNumTyp = '0' + SVX_NUM_CHARS_UPPER_LETTER, eTmpScan = UPPER_ALPHA;
876cdf0e10cSrcweir 			else
877cdf0e10cSrcweir 				cNumTyp = '0' + SVX_NUM_CHARS_LOWER_LETTER, eTmpScan = LOWER_ALPHA;
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 
880cdf0e10cSrcweir 			//ggfs. auf roemische Zeichen umschalten (nur bei c/d!)?
881cdf0e10cSrcweir 			if( 1 == nDigitCnt && ( eScan & (UPPER_ALPHA|LOWER_ALPHA) ) &&
882cdf0e10cSrcweir 				( 3 == nStart || 4 == nStart) && 256 > cLow &&
883cdf0e10cSrcweir 				strchr( "mdclxvi", cLow ) &&
884cdf0e10cSrcweir 				(( eScan & UPPER_ALPHA ) ? (eTmpScan & (UPPER_ALPHA|UPPER_ROMAN))
885cdf0e10cSrcweir 										 : (eTmpScan & (LOWER_ALPHA|LOWER_ROMAN))) )
886cdf0e10cSrcweir 			{
887cdf0e10cSrcweir 				sal_Unicode c = '0';
888cdf0e10cSrcweir 				nStart = 3 == nStart ? 100 : 500;
889cdf0e10cSrcweir 				if( UPPER_ALPHA == eTmpScan )
890cdf0e10cSrcweir 					eTmpScan = UPPER_ROMAN, c += SVX_NUM_ROMAN_UPPER;
891cdf0e10cSrcweir 				else
892cdf0e10cSrcweir 					eTmpScan = LOWER_ROMAN, c += SVX_NUM_ROMAN_LOWER;
893cdf0e10cSrcweir 
894cdf0e10cSrcweir 				( eScan &= ~(UPPER_ALPHA|LOWER_ALPHA)) |= eTmpScan;
895cdf0e10cSrcweir 				if( pNumTypes )
896cdf0e10cSrcweir 					pNumTypes->SetChar( pNumTypes->Len() - 1, c );
897cdf0e10cSrcweir 			}
898cdf0e10cSrcweir 
899cdf0e10cSrcweir 			if( eScan & DELIM )
900cdf0e10cSrcweir 			{
901cdf0e10cSrcweir 				if( eScan & CHG )		// nicht wenns mit einer Zahl beginnt
902cdf0e10cSrcweir 				{
903cdf0e10cSrcweir 					++nDigitLvl;
904cdf0e10cSrcweir 					if( pPostFix )
905cdf0e10cSrcweir 						*pPostFix += (sal_Unicode)1;
906cdf0e10cSrcweir 				}
907cdf0e10cSrcweir 
908cdf0e10cSrcweir 				if( pNumTypes )
909cdf0e10cSrcweir 					*pNumTypes += cNumTyp;
910cdf0e10cSrcweir 				eScan = eScan | CHG;
911cdf0e10cSrcweir 			}
912cdf0e10cSrcweir 			else if( pNumTypes && !(eScan & eTmpScan) )
913cdf0e10cSrcweir 				*pNumTypes += cNumTyp;
914cdf0e10cSrcweir 
915cdf0e10cSrcweir 			eScan &= ~DELIM;		// Delim raus
916cdf0e10cSrcweir 
917cdf0e10cSrcweir 			// falls ein andere Type gesetzt ist, brechen wir ab
918cdf0e10cSrcweir 			if( 0 != ( eScan & ~CHG ) && eTmpScan != ( eScan & ~CHG ))
919cdf0e10cSrcweir 				return USHRT_MAX;
920cdf0e10cSrcweir 
921cdf0e10cSrcweir 			if( eTmpScan & (UPPER_ALPHA | LOWER_ALPHA) )
922cdf0e10cSrcweir 			{
923cdf0e10cSrcweir 				// Buchstaben nur zulassen, wenn sie einmalig vorkommen
924cdf0e10cSrcweir                 return USHRT_MAX;
925cdf0e10cSrcweir 			}
926cdf0e10cSrcweir 			else
927cdf0e10cSrcweir 			{
928cdf0e10cSrcweir 				// roemische Zahlen: checke ob das gueltige Zeichen sind
929cdf0e10cSrcweir 				sal_uInt16 nVal;
930cdf0e10cSrcweir 				sal_Bool bError = sal_False;
931cdf0e10cSrcweir 				switch( cLow )
932cdf0e10cSrcweir 				{
933cdf0e10cSrcweir 				case 'm':	nVal = 1000; goto CHECK_ROMAN_1;
934cdf0e10cSrcweir 				case 'd':	nVal =  500; goto CHECK_ROMAN_5;
935cdf0e10cSrcweir 				case 'c':	nVal =  100; goto CHECK_ROMAN_1;
936cdf0e10cSrcweir 				case 'l':	nVal =   50; goto CHECK_ROMAN_5;
937cdf0e10cSrcweir 				case 'x':	nVal =   10; goto CHECK_ROMAN_1;
938cdf0e10cSrcweir 				case 'v':	nVal =    5; goto CHECK_ROMAN_5;
939cdf0e10cSrcweir 
940cdf0e10cSrcweir CHECK_ROMAN_1:
941cdf0e10cSrcweir 					{
942cdf0e10cSrcweir 						int nMod5 = nStart % (nVal * 5);
943cdf0e10cSrcweir 						int nLast = nStart % nVal;
944cdf0e10cSrcweir 						int n10 = nVal / 10;
945cdf0e10cSrcweir 
946cdf0e10cSrcweir 						if( nMod5 == ((3 * nVal) + n10 ) ||
947cdf0e10cSrcweir 							nMod5 == ((4 * nVal) + n10 ) ||
948cdf0e10cSrcweir 							nLast == n10 )
949cdf0e10cSrcweir 							nStart = static_cast<sal_uInt16>(nStart + (n10 * 8));
950cdf0e10cSrcweir 						else if( nMod5 == 0 ||
951cdf0e10cSrcweir 								 nMod5 == (1 * nVal) ||
952cdf0e10cSrcweir 								 nMod5 == (2 * nVal) )
953cdf0e10cSrcweir 							nStart = nStart + nVal;
954cdf0e10cSrcweir 						else
955cdf0e10cSrcweir 							bError = sal_True;
956cdf0e10cSrcweir 					}
957cdf0e10cSrcweir 					break;
958cdf0e10cSrcweir 
959cdf0e10cSrcweir CHECK_ROMAN_5:
960cdf0e10cSrcweir 					{
961cdf0e10cSrcweir 						if( ( nStart / nVal ) & 1 )
962cdf0e10cSrcweir 							bError = sal_True;
963cdf0e10cSrcweir 						else
964cdf0e10cSrcweir 						{
965cdf0e10cSrcweir 							int nMod = nStart % nVal;
966cdf0e10cSrcweir 							int n10 = nVal / 5;
967cdf0e10cSrcweir 							if( n10 == nMod )
968cdf0e10cSrcweir 								nStart = static_cast<sal_uInt16>(nStart + (3 * n10));
969cdf0e10cSrcweir 							else if( 0 == nMod )
970cdf0e10cSrcweir 								nStart = nStart + nVal;
971cdf0e10cSrcweir 							else
972cdf0e10cSrcweir 								bError = sal_True;
973cdf0e10cSrcweir 						}
974cdf0e10cSrcweir 					}
975cdf0e10cSrcweir 					break;
976cdf0e10cSrcweir 
977cdf0e10cSrcweir 				case 'i':
978cdf0e10cSrcweir 						if( nStart % 5 >= 3 )
979cdf0e10cSrcweir 							bError = sal_True;
980cdf0e10cSrcweir 						else
981cdf0e10cSrcweir 							nStart += 1;
982cdf0e10cSrcweir 						break;
983cdf0e10cSrcweir 
984cdf0e10cSrcweir 				default:
985cdf0e10cSrcweir 					bError = sal_True;
986cdf0e10cSrcweir 				}
987cdf0e10cSrcweir 
988cdf0e10cSrcweir 				if( bError )
989cdf0e10cSrcweir 					return USHRT_MAX;
990cdf0e10cSrcweir 			}
991cdf0e10cSrcweir 			eScan |= eTmpScan;			// Digit rein
992cdf0e10cSrcweir 			++nDigitCnt;
993cdf0e10cSrcweir 		}
994cdf0e10cSrcweir         else if( (256 > cCurrentChar &&
995cdf0e10cSrcweir                  strchr( ".)(", cCurrentChar )) ||
996cdf0e10cSrcweir                  0x3002 == cCurrentChar /* Chinese trad. dot */||
997cdf0e10cSrcweir                  0xff0e == cCurrentChar /* Japanese dot */||
998cdf0e10cSrcweir                  0xFF08 == cCurrentChar /* opening bracket Chin./Jap.*/||
999cdf0e10cSrcweir                  0xFF09 == cCurrentChar )/* closing bracket Chin./Jap. */
1000cdf0e10cSrcweir 		{
1001cdf0e10cSrcweir             if(cCurrentChar == '(' || cCurrentChar == 0xFF09)
1002cdf0e10cSrcweir 				nOpeningParentheses++;
1003cdf0e10cSrcweir             else if(cCurrentChar == ')'|| cCurrentChar == 0xFF08)
1004cdf0e10cSrcweir 				nClosingParentheses++;
1005cdf0e10cSrcweir 			// nur wenn noch keine Zahlen gelesen wurden!
1006cdf0e10cSrcweir 			if( pPreFix && !( eScan & ( NO_DELIM | CHG )) )
1007cdf0e10cSrcweir 				*pPreFix += rTxt.GetChar( nPos );
1008cdf0e10cSrcweir 			else if( pPostFix )
1009cdf0e10cSrcweir 				*pPostFix += rTxt.GetChar( nPos );
1010cdf0e10cSrcweir 
1011cdf0e10cSrcweir 			if( NO_DELIM & eScan )
1012cdf0e10cSrcweir 			{
1013cdf0e10cSrcweir 				eScan |= CHG;
1014cdf0e10cSrcweir 				if( pPreFix )
1015cdf0e10cSrcweir 					(*pPreFix += (sal_Unicode)1)
1016cdf0e10cSrcweir 							  += String::CreateFromInt32( nStart );
1017cdf0e10cSrcweir 			}
1018cdf0e10cSrcweir 			eScan &= ~NO_DELIM;		// Delim raus
1019cdf0e10cSrcweir 			eScan |= DELIM;			// Digit rein
1020cdf0e10cSrcweir 			nDigitCnt = 0;
1021cdf0e10cSrcweir 			nStart = 0;
1022cdf0e10cSrcweir 		}
1023cdf0e10cSrcweir 		else
1024cdf0e10cSrcweir 			break;
1025cdf0e10cSrcweir 		++nPos;
1026cdf0e10cSrcweir 	}
1027cdf0e10cSrcweir     if( !( CHG & eScan ) || rPos == nPos ||
1028cdf0e10cSrcweir 		nPos == rTxt.Len() || !IsSpace( rTxt.GetChar( nPos ) ) ||
1029cdf0e10cSrcweir 		(nOpeningParentheses > nClosingParentheses))
1030cdf0e10cSrcweir 		return USHRT_MAX;
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir 	if( (NO_DELIM & eScan) && pPreFix )		// den letzen nicht vergessen
1033cdf0e10cSrcweir 		(*pPreFix += (sal_Unicode)1) += String::CreateFromInt32( nStart );
1034cdf0e10cSrcweir 
1035cdf0e10cSrcweir 	rPos = nPos;
1036cdf0e10cSrcweir 	return nDigitLvl;		// 0 .. 9 (MAXLEVEL - 1)
1037cdf0e10cSrcweir }
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir 
SetColl(sal_uInt16 nId,sal_Bool bHdLineOrText)1040cdf0e10cSrcweir void SwAutoFormat::SetColl( sal_uInt16 nId, sal_Bool bHdLineOrText )
1041cdf0e10cSrcweir {
1042cdf0e10cSrcweir 	aDelPam.DeleteMark();
1043cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode = aNdIdx;
1044cdf0e10cSrcweir 	aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, 0 );
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir 	// behalte harte Tabs, Ausrichtung, Sprache, Silbentrennung,
1047cdf0e10cSrcweir 	// DropCaps und fast alle Frame-Attribute
1048cdf0e10cSrcweir 	SfxItemSet aSet( pDoc->GetAttrPool(),
1049cdf0e10cSrcweir 						RES_PARATR_ADJUST, RES_PARATR_ADJUST,
1050cdf0e10cSrcweir 						RES_PARATR_TABSTOP, RES_PARATR_DROP,
1051cdf0e10cSrcweir 						RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
1052cdf0e10cSrcweir 						RES_BACKGROUND, RES_SHADOW,
1053cdf0e10cSrcweir 						0 );
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir     if( pAktTxtNd->HasSwAttrSet() )
1056cdf0e10cSrcweir 	{
1057cdf0e10cSrcweir 		aSet.Put( *pAktTxtNd->GetpSwAttrSet() );
1058cdf0e10cSrcweir 		// einige Sonderbedingungen:
1059cdf0e10cSrcweir 		// HeaderLine/Textkoerper: nur zentriert oder rechts mitnehmem
1060cdf0e10cSrcweir 		// sonst nur den Blocksatz
1061cdf0e10cSrcweir 		SvxAdjustItem* pAdj;
1062cdf0e10cSrcweir 		if( SFX_ITEM_SET == aSet.GetItemState( RES_PARATR_ADJUST,
1063cdf0e10cSrcweir 						sal_False, (const SfxPoolItem**)&pAdj ))
1064cdf0e10cSrcweir 		{
1065cdf0e10cSrcweir 			SvxAdjust eAdj = pAdj->GetAdjust();
1066cdf0e10cSrcweir 			if( bHdLineOrText ? (SVX_ADJUST_RIGHT != eAdj &&
1067cdf0e10cSrcweir 								 SVX_ADJUST_CENTER != eAdj)
1068cdf0e10cSrcweir 							  : SVX_ADJUST_BLOCK != eAdj )
1069cdf0e10cSrcweir 				aSet.ClearItem( RES_PARATR_ADJUST );
1070cdf0e10cSrcweir 		}
1071cdf0e10cSrcweir 	}
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir 	pDoc->SetTxtFmtCollByAutoFmt( *aDelPam.GetPoint(), nId, &aSet );
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir 
HasSelBlanks(SwPaM & rPam) const1077cdf0e10cSrcweir sal_Bool SwAutoFormat::HasSelBlanks( SwPaM& rPam ) const
1078cdf0e10cSrcweir {
1079cdf0e10cSrcweir 	// noch ein Blank am Anfang oder Ende ?
1080cdf0e10cSrcweir 	// nicht loeschen, wird wieder eingefuegt.
1081cdf0e10cSrcweir 	SwPosition * pPos = rPam.End();
1082cdf0e10cSrcweir 	xub_StrLen nBlnkPos = pPos->nContent.GetIndex();
1083cdf0e10cSrcweir 	SwTxtNode* pTxtNd = pPos->nNode.GetNode().GetTxtNode();
1084cdf0e10cSrcweir 	if( nBlnkPos && nBlnkPos-- < pTxtNd->GetTxt().Len() &&
1085cdf0e10cSrcweir 		( ' ' == pTxtNd->GetTxt().GetChar( nBlnkPos ) ))
1086cdf0e10cSrcweir // JP 23.08.95: keine Tabs stehen lassen, diese in Blanks wandeln
1087cdf0e10cSrcweir //        ( ' ' == ( cCh = pTxtNd->GetTxt()[ nBlnkPos ] ) || '\t' == cCh ))
1088cdf0e10cSrcweir 		pPos->nContent--;
1089cdf0e10cSrcweir 	else
1090cdf0e10cSrcweir 	{
1091cdf0e10cSrcweir 		pPos = rPam.GetPoint() == pPos ? rPam.GetMark() : rPam.GetPoint();
1092cdf0e10cSrcweir 		nBlnkPos = pPos->nContent.GetIndex();
1093cdf0e10cSrcweir 		pTxtNd = pPos->nNode.GetNode().GetTxtNode();
1094cdf0e10cSrcweir 		if( nBlnkPos < pTxtNd->GetTxt().Len() &&
1095cdf0e10cSrcweir 			( ' ' == pTxtNd->GetTxt().GetChar( nBlnkPos )))
1096cdf0e10cSrcweir // JP 23.08.95: keine Tabs stehen lassen, diese in Blanks wandeln
1097cdf0e10cSrcweir //            ( ' ' == ( cCh = pTxtNd->GetTxt()[ nBlnkPos ] ) || '\t' == cCh ))
1098cdf0e10cSrcweir 			pPos->nContent++;
1099cdf0e10cSrcweir 		else
1100cdf0e10cSrcweir 			return sal_False;
1101cdf0e10cSrcweir 	}
1102cdf0e10cSrcweir 	return sal_True;
1103cdf0e10cSrcweir }
1104cdf0e10cSrcweir 
1105cdf0e10cSrcweir 
HasBreakAttr(const SwTxtNode & rTxtNd) const1106cdf0e10cSrcweir sal_Bool SwAutoFormat::HasBreakAttr( const SwTxtNode& rTxtNd ) const
1107cdf0e10cSrcweir {
1108cdf0e10cSrcweir     const SfxItemSet* pSet = rTxtNd.GetpSwAttrSet();
1109cdf0e10cSrcweir 	if( !pSet )
1110cdf0e10cSrcweir 		return sal_False;
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir 	const SfxPoolItem* pItem;
1113cdf0e10cSrcweir 	if( SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, sal_False, &pItem )
1114cdf0e10cSrcweir 		&& SVX_BREAK_NONE != ((SvxFmtBreakItem*)pItem)->GetBreak() )
1115cdf0e10cSrcweir 		return sal_True;
1116cdf0e10cSrcweir 
1117cdf0e10cSrcweir 	if( SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, sal_False, &pItem )
1118cdf0e10cSrcweir 		&& ((SwFmtPageDesc*)pItem)->GetPageDesc()
1119cdf0e10cSrcweir 		&& nsUseOnPage::PD_NONE != ((SwFmtPageDesc*)pItem)->GetPageDesc()->GetUseOn() )
1120cdf0e10cSrcweir 		return sal_True;
1121cdf0e10cSrcweir 	return sal_False;
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir 
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir // ist ein Punkt am Ende ??
IsSentenceAtEnd(const SwTxtNode & rTxtNd) const1126cdf0e10cSrcweir sal_Bool SwAutoFormat::IsSentenceAtEnd( const SwTxtNode& rTxtNd ) const
1127cdf0e10cSrcweir {
1128cdf0e10cSrcweir 	const String& rStr = rTxtNd.GetTxt();
1129cdf0e10cSrcweir 	xub_StrLen n = rStr.Len();
1130cdf0e10cSrcweir 	if( !n )
1131cdf0e10cSrcweir 		return sal_True;
1132cdf0e10cSrcweir 
1133cdf0e10cSrcweir 	while( --n && IsSpace( rStr.GetChar( n  ) ) )
1134cdf0e10cSrcweir 		;
1135cdf0e10cSrcweir 	return '.' == rStr.GetChar( n );
1136cdf0e10cSrcweir }
1137cdf0e10cSrcweir 
1138cdf0e10cSrcweir 
1139cdf0e10cSrcweir // loesche im Node Anfang oder/und Ende
DeleteAktPara(sal_Bool bStart,sal_Bool bEnd)1140cdf0e10cSrcweir void SwAutoFormat::DeleteAktPara( sal_Bool bStart, sal_Bool bEnd )
1141cdf0e10cSrcweir {
1142cdf0e10cSrcweir 	if( aFlags.bAFmtByInput
1143cdf0e10cSrcweir 		? aFlags.bAFmtByInpDelSpacesAtSttEnd
1144cdf0e10cSrcweir 		: aFlags.bAFmtDelSpacesAtSttEnd )
1145cdf0e10cSrcweir 	{
1146cdf0e10cSrcweir 		// Loesche Blanks am Ende vom akt. und am Anfang vom naechsten
1147cdf0e10cSrcweir 		aDelPam.DeleteMark();
1148cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode = aNdIdx;
1149cdf0e10cSrcweir 		xub_StrLen nPos;
1150cdf0e10cSrcweir 		if( bStart && 0 != ( nPos = GetLeadingBlanks( pAktTxtNd->GetTxt() )))
1151cdf0e10cSrcweir 		{
1152cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, 0 );
1153cdf0e10cSrcweir 			aDelPam.SetMark();
1154cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent = nPos;
1155cdf0e10cSrcweir 			DeleteSel( aDelPam );
1156cdf0e10cSrcweir 			aDelPam.DeleteMark();
1157cdf0e10cSrcweir 		}
1158cdf0e10cSrcweir 		if( bEnd && pAktTxtNd->GetTxt().Len() !=
1159cdf0e10cSrcweir 					( nPos = GetTrailingBlanks( pAktTxtNd->GetTxt() )) )
1160cdf0e10cSrcweir 		{
1161cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, pAktTxtNd->GetTxt().Len() );
1162cdf0e10cSrcweir 			aDelPam.SetMark();
1163cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent = nPos;
1164cdf0e10cSrcweir 			DeleteSel( aDelPam );
1165cdf0e10cSrcweir 			aDelPam.DeleteMark();
1166cdf0e10cSrcweir 		}
1167cdf0e10cSrcweir 	}
1168cdf0e10cSrcweir }
1169cdf0e10cSrcweir 
DeleteSel(SwPaM & rDelPam)1170cdf0e10cSrcweir void SwAutoFormat::DeleteSel( SwPaM& rDelPam )
1171cdf0e10cSrcweir {
1172cdf0e10cSrcweir 	if( aFlags.bWithRedlining )
1173cdf0e10cSrcweir 	{
1174cdf0e10cSrcweir 		// damit der DelPam auch verschoben wird, in den Shell-Cursr-Ring
1175cdf0e10cSrcweir 		// mit aufnehmen !!
1176cdf0e10cSrcweir 		SwPaM* pShCrsr = pEditShell->_GetCrsr();
1177cdf0e10cSrcweir 		SwPaM aTmp( *pAktTxtNd, 0, pShCrsr );
1178cdf0e10cSrcweir 
1179cdf0e10cSrcweir 		Ring *pPrev = rDelPam.GetPrev();
1180cdf0e10cSrcweir 		rDelPam.MoveRingTo( pShCrsr );
1181cdf0e10cSrcweir 
1182cdf0e10cSrcweir 		pEditShell->DeleteSel( rDelPam );
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir 		// und den Pam wieder herausnehmen:
1185cdf0e10cSrcweir 		Ring *p, *pNext = (Ring*)&rDelPam;
1186cdf0e10cSrcweir 		do {
1187cdf0e10cSrcweir 			p = pNext;
1188cdf0e10cSrcweir 			pNext = p->GetNext();
1189cdf0e10cSrcweir 			p->MoveTo( &rDelPam );
1190cdf0e10cSrcweir 		} while( p != pPrev );
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir 		aNdIdx = aTmp.GetPoint()->nNode;
1193cdf0e10cSrcweir 		pAktTxtNd = aNdIdx.GetNode().GetTxtNode();
1194cdf0e10cSrcweir 	}
1195cdf0e10cSrcweir 	else
1196cdf0e10cSrcweir 		pEditShell->DeleteSel( rDelPam );
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir 
DeleteAktNxtPara(const String & rNxtPara)1199cdf0e10cSrcweir sal_Bool SwAutoFormat::DeleteAktNxtPara( const String& rNxtPara )
1200cdf0e10cSrcweir {
1201cdf0e10cSrcweir 	// Loesche Blanks am Ende vom akt. und am Anfang vom naechsten
1202cdf0e10cSrcweir 	aDelPam.DeleteMark();
1203cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode = aNdIdx;
1204cdf0e10cSrcweir 	aDelPam.GetPoint()->nContent.Assign( pAktTxtNd,
1205cdf0e10cSrcweir 					GetTrailingBlanks( pAktTxtNd->GetTxt() ) );
1206cdf0e10cSrcweir 	aDelPam.SetMark();
1207cdf0e10cSrcweir 
1208cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode++;
1209cdf0e10cSrcweir 	SwTxtNode* pTNd = aDelPam.GetNode()->GetTxtNode();
1210cdf0e10cSrcweir 	if( !pTNd )
1211cdf0e10cSrcweir 	{
1212cdf0e10cSrcweir 		// dann nur bis zum Ende von Absatz loeschen
1213cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode--;
1214cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent = pAktTxtNd->GetTxt().Len();
1215cdf0e10cSrcweir 	}
1216cdf0e10cSrcweir 	else
1217cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent.Assign( pTNd,
1218cdf0e10cSrcweir 							GetLeadingBlanks( rNxtPara ));
1219cdf0e10cSrcweir 
1220cdf0e10cSrcweir 	// noch ein Blank am Anfang oder Ende ?
1221cdf0e10cSrcweir 	// nicht loeschen, wird wieder eingefuegt.
1222cdf0e10cSrcweir 	sal_Bool bHasBlnks = HasSelBlanks( aDelPam );
1223cdf0e10cSrcweir 
1224cdf0e10cSrcweir 	if( *aDelPam.GetPoint() != *aDelPam.GetMark() )
1225cdf0e10cSrcweir 		DeleteSel( aDelPam );
1226cdf0e10cSrcweir 	aDelPam.DeleteMark();
1227cdf0e10cSrcweir 
1228cdf0e10cSrcweir 	return !bHasBlnks;
1229cdf0e10cSrcweir }
1230cdf0e10cSrcweir 
1231cdf0e10cSrcweir 
DelEmptyLine(sal_Bool bTstNextPara)1232cdf0e10cSrcweir void SwAutoFormat::DelEmptyLine( sal_Bool bTstNextPara )
1233cdf0e10cSrcweir {
1234cdf0e10cSrcweir 	SetRedlineTxt( STR_AUTOFMTREDL_DEL_EMPTY_PARA );
1235cdf0e10cSrcweir 	// Loesche Blanks den leeren Absatz
1236cdf0e10cSrcweir 	aDelPam.DeleteMark();
1237cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode = aNdIdx;
1238cdf0e10cSrcweir 	aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, pAktTxtNd->GetTxt().Len() );
1239cdf0e10cSrcweir 	aDelPam.SetMark();
1240cdf0e10cSrcweir 
1241cdf0e10cSrcweir 	aDelPam.GetMark()->nNode--;
1242cdf0e10cSrcweir 	SwTxtNode* pTNd = aDelPam.GetNode( sal_False )->GetTxtNode();
1243cdf0e10cSrcweir 	if( pTNd )
1244cdf0e10cSrcweir 		// erstmal den vorherigen Textnode benutzen.
1245cdf0e10cSrcweir 		aDelPam.GetMark()->nContent.Assign( pTNd, pTNd->GetTxt().Len() );
1246cdf0e10cSrcweir 	else if( bTstNextPara )
1247cdf0e10cSrcweir 	{
1248cdf0e10cSrcweir 		// dann versuche den naechsten (am Anfang vom Dok, Tabellen-Zellen,
1249cdf0e10cSrcweir 		// Rahmen, ...
1250cdf0e10cSrcweir 		aDelPam.GetMark()->nNode += 2;
1251cdf0e10cSrcweir 		pTNd = aDelPam.GetNode( sal_False )->GetTxtNode();
1252cdf0e10cSrcweir 		if( pTNd )
1253cdf0e10cSrcweir 		{
1254cdf0e10cSrcweir 			aDelPam.GetMark()->nContent.Assign( pTNd, 0 );
1255cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent = 0;
1256cdf0e10cSrcweir 		}
1257cdf0e10cSrcweir 	}
1258cdf0e10cSrcweir 	else
1259cdf0e10cSrcweir 	{
1260cdf0e10cSrcweir 		aDelPam.GetMark()->nNode = aNdIdx;
1261cdf0e10cSrcweir 		aDelPam.GetMark()->nContent = 0;
1262cdf0e10cSrcweir 		pTNd = pAktTxtNd;
1263cdf0e10cSrcweir 	}
1264cdf0e10cSrcweir 	if( pTNd )
1265cdf0e10cSrcweir 		DeleteSel( aDelPam );
1266cdf0e10cSrcweir 
1267cdf0e10cSrcweir 	aDelPam.DeleteMark();
1268cdf0e10cSrcweir 	ClearRedlineTxt();
1269cdf0e10cSrcweir }
1270cdf0e10cSrcweir 
1271cdf0e10cSrcweir 
DelMoreLinesBlanks(sal_Bool bWithLineBreaks)1272cdf0e10cSrcweir void SwAutoFormat::DelMoreLinesBlanks( sal_Bool bWithLineBreaks )
1273cdf0e10cSrcweir {
1274cdf0e10cSrcweir 	if( aFlags.bAFmtByInput
1275cdf0e10cSrcweir 		? aFlags.bAFmtByInpDelSpacesBetweenLines
1276cdf0e10cSrcweir 		: aFlags.bAFmtDelSpacesBetweenLines	)
1277cdf0e10cSrcweir 	{
1278cdf0e10cSrcweir 		// loesche alle "Blanks" Links und Rechts vom Einzug
1279cdf0e10cSrcweir 		aDelPam.DeleteMark();
1280cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode = aNdIdx;
1281cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, 0 );
1282cdf0e10cSrcweir 
1283cdf0e10cSrcweir 		SwTxtFrmInfo aFInfo( pAktTxtFrm );
1284cdf0e10cSrcweir 		aFInfo.GetSpaces( aDelPam, !aFlags.bAFmtByInput || bWithLineBreaks );
1285cdf0e10cSrcweir 
1286cdf0e10cSrcweir 		SwPaM* pNxt;
1287cdf0e10cSrcweir 		do {
1288cdf0e10cSrcweir 			pNxt = (SwPaM*)aDelPam.GetNext();
1289cdf0e10cSrcweir 			if( pNxt->HasMark() && *pNxt->GetPoint() != *pNxt->GetMark() )
1290cdf0e10cSrcweir 			{
1291cdf0e10cSrcweir 				sal_Bool bHasBlnks = HasSelBlanks( *pNxt );
1292cdf0e10cSrcweir 				DeleteSel( *pNxt );
1293cdf0e10cSrcweir 				if( !bHasBlnks )
1294cdf0e10cSrcweir                 {
1295cdf0e10cSrcweir                     pDoc->InsertString( *pNxt, sal_Unicode(' ') );
1296cdf0e10cSrcweir                 }
1297cdf0e10cSrcweir 			}
1298cdf0e10cSrcweir 
1299cdf0e10cSrcweir 			if( pNxt == &aDelPam )
1300cdf0e10cSrcweir 				break;
1301cdf0e10cSrcweir 			delete pNxt;
1302cdf0e10cSrcweir 		} while( sal_True );
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir 		aDelPam.DeleteMark();
1305cdf0e10cSrcweir 	}
1306cdf0e10cSrcweir }
1307cdf0e10cSrcweir 
1308cdf0e10cSrcweir 
1309cdf0e10cSrcweir 		// loesche den vorherigen Absatz
DelPrevPara()1310cdf0e10cSrcweir void SwAutoFormat::DelPrevPara()
1311cdf0e10cSrcweir {
1312cdf0e10cSrcweir 	aDelPam.DeleteMark();
1313cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode = aNdIdx;
1314cdf0e10cSrcweir 	aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, 0 );
1315cdf0e10cSrcweir 	aDelPam.SetMark();
1316cdf0e10cSrcweir 
1317cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode--;
1318cdf0e10cSrcweir 	SwTxtNode* pTNd = aDelPam.GetNode()->GetTxtNode();
1319cdf0e10cSrcweir 	if( pTNd )
1320cdf0e10cSrcweir 	{
1321cdf0e10cSrcweir 		// erstmal den vorherigen Textnode benutzen.
1322cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent.Assign( pTNd, pTNd->GetTxt().Len() );
1323cdf0e10cSrcweir 		DeleteSel( aDelPam );
1324cdf0e10cSrcweir 	}
1325cdf0e10cSrcweir 	aDelPam.DeleteMark();
1326cdf0e10cSrcweir }
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir 
BuildIndent()1329cdf0e10cSrcweir void SwAutoFormat::BuildIndent()
1330cdf0e10cSrcweir {
1331cdf0e10cSrcweir 	SetRedlineTxt( STR_AUTOFMTREDL_SET_TMPL_INDENT );
1332cdf0e10cSrcweir 
1333cdf0e10cSrcweir 	// lese alle nachfolgenden Absaetze die zu diesem Einzug gehoeren
1334cdf0e10cSrcweir 	sal_Bool bBreak = sal_True;
1335cdf0e10cSrcweir 	if( bMoreLines )
1336cdf0e10cSrcweir 		DelMoreLinesBlanks( sal_True );
1337cdf0e10cSrcweir 	else
1338cdf0e10cSrcweir 		bBreak = !IsFastFullLine( *pAktTxtNd ) ||
1339cdf0e10cSrcweir 				IsBlanksInString( *pAktTxtNd ) ||
1340cdf0e10cSrcweir 				IsSentenceAtEnd( *pAktTxtNd );
1341cdf0e10cSrcweir 	SetColl( RES_POOLCOLL_TEXT_IDENT );
1342cdf0e10cSrcweir 	if( !bBreak )
1343cdf0e10cSrcweir 	{
1344cdf0e10cSrcweir 		SetRedlineTxt( STR_AUTOFMTREDL_DEL_MORELINES );
1345cdf0e10cSrcweir 		const SwTxtNode* pNxtNd = GetNextNode();
1346cdf0e10cSrcweir 		if( pNxtNd && !bEnde )
1347cdf0e10cSrcweir 		{
1348cdf0e10cSrcweir 			do {
1349cdf0e10cSrcweir 				bBreak = !IsFastFullLine( *pNxtNd ) ||
1350cdf0e10cSrcweir 						IsBlanksInString( *pNxtNd ) ||
1351cdf0e10cSrcweir 						IsSentenceAtEnd( *pNxtNd );
1352cdf0e10cSrcweir 				if( DeleteAktNxtPara( pNxtNd->GetTxt() ))
1353cdf0e10cSrcweir                 {
1354cdf0e10cSrcweir                     pDoc->InsertString( aDelPam, sal_Unicode(' ') );
1355cdf0e10cSrcweir                 }
1356cdf0e10cSrcweir 				if( bBreak )
1357cdf0e10cSrcweir 					break;
1358cdf0e10cSrcweir 				pNxtNd = GetNextNode();
1359cdf0e10cSrcweir 			} while( CanJoin( pNxtNd ) &&
1360cdf0e10cSrcweir 					!CalcLevel( *pNxtNd ) );
1361cdf0e10cSrcweir 		}
1362cdf0e10cSrcweir 	}
1363cdf0e10cSrcweir 	DeleteAktPara( sal_True, sal_True );
1364cdf0e10cSrcweir 	AutoCorrect();
1365cdf0e10cSrcweir }
1366cdf0e10cSrcweir 
1367cdf0e10cSrcweir 
BuildTextIndent()1368cdf0e10cSrcweir void SwAutoFormat::BuildTextIndent()
1369cdf0e10cSrcweir {
1370cdf0e10cSrcweir 	SetRedlineTxt( STR_AUTOFMTREDL_SET_TMPL_TEXT_INDENT);
1371cdf0e10cSrcweir 	// lese alle nachfolgenden Absaetze die zu diesem Einzug gehoeren
1372cdf0e10cSrcweir 	sal_Bool bBreak = sal_True;
1373cdf0e10cSrcweir 	if( bMoreLines )
1374cdf0e10cSrcweir 		DelMoreLinesBlanks( sal_True );
1375cdf0e10cSrcweir 	else
1376cdf0e10cSrcweir 		bBreak = !IsFastFullLine( *pAktTxtNd ) ||
1377cdf0e10cSrcweir 					IsBlanksInString( *pAktTxtNd ) ||
1378cdf0e10cSrcweir 					IsSentenceAtEnd( *pAktTxtNd );
1379cdf0e10cSrcweir 
1380cdf0e10cSrcweir 	if( aFlags.bAFmtByInput )
1381cdf0e10cSrcweir 		pAktTxtNd->SetAutoFmtLvl( (sal_uInt8)CalcLevel( *pAktTxtNd ) );
1382cdf0e10cSrcweir 
1383cdf0e10cSrcweir 	SetColl( RES_POOLCOLL_TEXT_MOVE );
1384cdf0e10cSrcweir 	if( !bBreak )
1385cdf0e10cSrcweir 	{
1386cdf0e10cSrcweir 		SetRedlineTxt( STR_AUTOFMTREDL_DEL_MORELINES );
1387cdf0e10cSrcweir 		const SwTxtNode* pNxtNd = GetNextNode();
1388cdf0e10cSrcweir 		while(	CanJoin( pNxtNd ) &&
1389cdf0e10cSrcweir 				CalcLevel( *pNxtNd ) )
1390cdf0e10cSrcweir 		{
1391cdf0e10cSrcweir 			bBreak = !IsFastFullLine( *pNxtNd ) || IsBlanksInString( *pNxtNd ) ||
1392cdf0e10cSrcweir 					IsSentenceAtEnd( *pNxtNd );
1393cdf0e10cSrcweir 			if( DeleteAktNxtPara( pNxtNd->GetTxt() ) )
1394cdf0e10cSrcweir             {
1395cdf0e10cSrcweir                 pDoc->InsertString( aDelPam, sal_Unicode(' ') );
1396cdf0e10cSrcweir             }
1397cdf0e10cSrcweir 			if( bBreak )
1398cdf0e10cSrcweir 				break;
1399cdf0e10cSrcweir 			pNxtNd = GetNextNode();
1400cdf0e10cSrcweir 		}
1401cdf0e10cSrcweir 	}
1402cdf0e10cSrcweir 	DeleteAktPara( sal_True, sal_True );
1403cdf0e10cSrcweir 	AutoCorrect();
1404cdf0e10cSrcweir }
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir 
BuildText()1407cdf0e10cSrcweir void SwAutoFormat::BuildText()
1408cdf0e10cSrcweir {
1409cdf0e10cSrcweir 	SetRedlineTxt( STR_AUTOFMTREDL_SET_TMPL_TEXT );
1410cdf0e10cSrcweir 	// lese alle nachfolgenden Absaetze die zu diesem Text
1411cdf0e10cSrcweir 	// ohne Einzug gehoeren
1412cdf0e10cSrcweir 	sal_Bool bBreak = sal_True;
1413cdf0e10cSrcweir 	if( bMoreLines )
1414cdf0e10cSrcweir 		DelMoreLinesBlanks();
1415cdf0e10cSrcweir 	else
1416cdf0e10cSrcweir 		bBreak = !IsFastFullLine( *pAktTxtNd ) ||
1417cdf0e10cSrcweir 					IsBlanksInString( *pAktTxtNd ) ||
1418cdf0e10cSrcweir 					IsSentenceAtEnd( *pAktTxtNd );
1419cdf0e10cSrcweir 	SetColl( RES_POOLCOLL_TEXT, sal_True );
1420cdf0e10cSrcweir 	if( !bBreak )
1421cdf0e10cSrcweir 	{
1422cdf0e10cSrcweir 		SetRedlineTxt( STR_AUTOFMTREDL_DEL_MORELINES );
1423cdf0e10cSrcweir 		const SwTxtNode* pNxtNd = GetNextNode();
1424cdf0e10cSrcweir 		while(	CanJoin( pNxtNd ) &&
1425cdf0e10cSrcweir 				!CalcLevel( *pNxtNd ) )
1426cdf0e10cSrcweir 		{
1427cdf0e10cSrcweir 			bBreak = !IsFastFullLine( *pNxtNd ) || IsBlanksInString( *pNxtNd ) ||
1428cdf0e10cSrcweir 					IsSentenceAtEnd( *pNxtNd );
1429cdf0e10cSrcweir 			if( DeleteAktNxtPara( pNxtNd->GetTxt() ) )
1430cdf0e10cSrcweir             {
1431cdf0e10cSrcweir                 pDoc->InsertString( aDelPam, sal_Unicode(' ') );
1432cdf0e10cSrcweir             }
1433cdf0e10cSrcweir 			if( bBreak )
1434cdf0e10cSrcweir 				break;
1435cdf0e10cSrcweir             const SwTxtNode* pCurrNode = pNxtNd;
1436cdf0e10cSrcweir 			pNxtNd = GetNextNode();
1437cdf0e10cSrcweir             if(!pNxtNd || pCurrNode == pNxtNd)
1438cdf0e10cSrcweir                 break;
1439cdf0e10cSrcweir 		}
1440cdf0e10cSrcweir 	}
1441cdf0e10cSrcweir 	DeleteAktPara( sal_True, sal_True );
1442cdf0e10cSrcweir 	AutoCorrect();
1443cdf0e10cSrcweir }
1444cdf0e10cSrcweir 
1445cdf0e10cSrcweir 
BuildEnum(sal_uInt16 nLvl,sal_uInt16 nDigitLevel)1446cdf0e10cSrcweir void SwAutoFormat::BuildEnum( sal_uInt16 nLvl, sal_uInt16 nDigitLevel )
1447cdf0e10cSrcweir {
1448cdf0e10cSrcweir 	SetRedlineTxt( STR_AUTOFMTREDL_SET_NUMBULET );
1449cdf0e10cSrcweir 
1450cdf0e10cSrcweir 	sal_Bool bBreak = sal_True;
1451cdf0e10cSrcweir 
1452cdf0e10cSrcweir 	// als erstes den akt. Einzug bestimmen und die Framebreite bestimmen
1453cdf0e10cSrcweir 	SwTwips nFrmWidth = pAktTxtFrm->Prt().Width();;
1454cdf0e10cSrcweir 	SwTwips nLeftTxtPos;
1455cdf0e10cSrcweir 	{
1456cdf0e10cSrcweir 		const sal_Unicode* pTxt = pAktTxtNd->GetTxt().GetBuffer(), *pSav = pTxt;
1457cdf0e10cSrcweir 		while( IsSpace( *pTxt ) )
1458cdf0e10cSrcweir 			++pTxt;
1459cdf0e10cSrcweir 
1460cdf0e10cSrcweir 		SwTxtFrmInfo aInfo( pAktTxtFrm );
1461cdf0e10cSrcweir 		nLeftTxtPos = aInfo.GetCharPos( static_cast<xub_StrLen>(pTxt - pSav) );
1462cdf0e10cSrcweir         nLeftTxtPos -= pAktTxtNd->GetSwAttrSet().GetLRSpace().GetLeft();
1463cdf0e10cSrcweir     }
1464cdf0e10cSrcweir 
1465cdf0e10cSrcweir 	if( bMoreLines )
1466cdf0e10cSrcweir 		DelMoreLinesBlanks();
1467cdf0e10cSrcweir 	else
1468cdf0e10cSrcweir 		bBreak = !IsFastFullLine( *pAktTxtNd ) ||
1469cdf0e10cSrcweir 					IsBlanksInString( *pAktTxtNd ) ||
1470cdf0e10cSrcweir 					IsSentenceAtEnd( *pAktTxtNd );
1471cdf0e10cSrcweir     sal_Bool bRTL = pEditShell->IsInRightToLeftText();
1472cdf0e10cSrcweir //	SetColl( RES_POOLCOLL_NUM_LEVEL1 + ( nLvl * 4 ) );
1473cdf0e10cSrcweir 	DeleteAktPara( sal_True, sal_True );
1474cdf0e10cSrcweir 
1475cdf0e10cSrcweir 	sal_Bool bChgBullet = sal_False, bChgEnum = sal_False;
1476cdf0e10cSrcweir 	xub_StrLen nAutoCorrPos = 0;
1477cdf0e10cSrcweir 
1478cdf0e10cSrcweir 	// falls die Numerierung gesetzt werden, die akt. besorgen
1479cdf0e10cSrcweir     // --> OD 2008-02-11 #newlistlevelattrs#
1480cdf0e10cSrcweir     SwNumRule aRule( pDoc->GetUniqueNumRuleName(),
1481cdf0e10cSrcweir                      // --> OD 2008-06-06 #i89178#
1482cdf0e10cSrcweir                      numfunc::GetDefaultPositionAndSpaceMode() );
1483cdf0e10cSrcweir                      // <--
1484cdf0e10cSrcweir     // <--
1485cdf0e10cSrcweir     const SwNumRule* pCur = 0;
1486cdf0e10cSrcweir 	if( aFlags.bSetNumRule && 0 != (pCur = pAktTxtNd->GetNumRule()) )
1487cdf0e10cSrcweir 		aRule = *pCur;
1488cdf0e10cSrcweir 
1489cdf0e10cSrcweir 	// ersetze das Bullet-Zeichen mit dem definiertem
1490cdf0e10cSrcweir 	const String& rStr = pAktTxtNd->GetTxt();
1491cdf0e10cSrcweir 	xub_StrLen nTxtStt = 0, nOrigTxtStt = 0;
1492cdf0e10cSrcweir 	const sal_Unicode* pFndBulletChr;
1493cdf0e10cSrcweir //	if( aFlags.bAFmtByInput ? aFlags.bSetNumRule : aFlags.bChgEnumNum &&
1494cdf0e10cSrcweir 	if( aFlags.bChgEnumNum &&
1495cdf0e10cSrcweir 		2 < rStr.Len() &&
1496cdf0e10cSrcweir 		0 != ( pFndBulletChr = StrChr( pBulletChar, rStr.GetChar( nTxtStt ) ))
1497cdf0e10cSrcweir 		&& IsSpace( rStr.GetChar( nTxtStt + 1 ) ) )
1498cdf0e10cSrcweir 	{
1499cdf0e10cSrcweir 		if( aFlags.bAFmtByInput )
1500cdf0e10cSrcweir 		{
1501cdf0e10cSrcweir 			if( aFlags.bSetNumRule )
1502cdf0e10cSrcweir 			{
1503cdf0e10cSrcweir 				SwCharFmt* pCFmt = pDoc->GetCharFmtFromPool(
1504cdf0e10cSrcweir 											RES_POOLCHR_BUL_LEVEL );
1505cdf0e10cSrcweir 				bChgBullet = sal_True;
1506cdf0e10cSrcweir 				// wurde das Format schon mal angepasst?
1507cdf0e10cSrcweir 				if( !aRule.GetNumFmt( nLvl ) )
1508cdf0e10cSrcweir 				{
1509cdf0e10cSrcweir 					int nBulletPos = pFndBulletChr - pBulletChar;
1510cdf0e10cSrcweir 					sal_Unicode cBullChar;
1511cdf0e10cSrcweir                     const Font* pBullFnt( 0 );
1512cdf0e10cSrcweir 					if( nBulletPos < cnPosEnDash )
1513cdf0e10cSrcweir 					{
1514cdf0e10cSrcweir 						cBullChar = aFlags.cBullet;
1515cdf0e10cSrcweir 						pBullFnt = &aFlags.aBulletFont;
1516cdf0e10cSrcweir 					}
1517cdf0e10cSrcweir 					else
1518cdf0e10cSrcweir 					{
1519cdf0e10cSrcweir 						cBullChar = nBulletPos < cnPosEmDash
1520cdf0e10cSrcweir 										? cStarSymbolEnDash
1521cdf0e10cSrcweir 										: cStarSymbolEmDash;
1522cdf0e10cSrcweir                         // --> OD 2008-06-03 #i63395#
1523cdf0e10cSrcweir                         // Only apply user defined default bullet font
1524cdf0e10cSrcweir                         if ( numfunc::IsDefBulletFontUserDefined() )
1525cdf0e10cSrcweir                         {
1526cdf0e10cSrcweir                             pBullFnt = &numfunc::GetDefBulletFont();
1527cdf0e10cSrcweir                         }
1528cdf0e10cSrcweir                         // <--
1529cdf0e10cSrcweir 					}
1530cdf0e10cSrcweir 
1531cdf0e10cSrcweir 					sal_uInt16 nAbsPos = lBullIndent;
1532cdf0e10cSrcweir 					sal_uInt16 nSpaceSteps = nLvl
1533cdf0e10cSrcweir 											? sal_uInt16(nLeftTxtPos / nLvl)
1534cdf0e10cSrcweir 											: lBullIndent;
1535cdf0e10cSrcweir 					for( sal_uInt8 n = 0; n < MAXLEVEL; ++n, nAbsPos = nAbsPos + nSpaceSteps )
1536cdf0e10cSrcweir 					{
1537cdf0e10cSrcweir 						SwNumFmt aFmt( aRule.Get( n ) );
1538cdf0e10cSrcweir 						aFmt.SetBulletFont( pBullFnt );
1539cdf0e10cSrcweir 						aFmt.SetBulletChar( cBullChar );
1540cdf0e10cSrcweir 						aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1541cdf0e10cSrcweir                         // #i93908# clear suffix for bullet lists
1542cdf0e10cSrcweir                         aFmt.SetPrefix(::rtl::OUString());
1543cdf0e10cSrcweir                         aFmt.SetSuffix(::rtl::OUString());
1544cdf0e10cSrcweir 						aFmt.SetFirstLineOffset( lBullFirstLineOffset );
1545cdf0e10cSrcweir 						aFmt.SetAbsLSpace( nAbsPos );
1546cdf0e10cSrcweir 						if( !aFmt.GetCharFmt() )
1547cdf0e10cSrcweir 							aFmt.SetCharFmt( pCFmt );
1548cdf0e10cSrcweir                         if( bRTL )
1549cdf0e10cSrcweir                             aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
1550cdf0e10cSrcweir 
1551cdf0e10cSrcweir 						aRule.Set( n, aFmt );
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir 						if( n == nLvl &&
1554cdf0e10cSrcweir 							nFrmWidth < ( nSpaceSteps * MAXLEVEL ) )
1555cdf0e10cSrcweir 							nSpaceSteps = static_cast<sal_uInt16>(( nFrmWidth - nLeftTxtPos ) /
1556cdf0e10cSrcweir 												( MAXLEVEL - nLvl ));
1557cdf0e10cSrcweir 					}
1558cdf0e10cSrcweir 				}
1559cdf0e10cSrcweir 			}
1560cdf0e10cSrcweir 		}
1561cdf0e10cSrcweir 		else
1562cdf0e10cSrcweir 		{
1563cdf0e10cSrcweir 			bChgBullet = sal_True;
1564cdf0e10cSrcweir 			SetColl( static_cast<sal_uInt16>(RES_POOLCOLL_BUL_LEVEL1 + ( Min( nLvl, cnNumBullColls ) * 4 )) );
1565cdf0e10cSrcweir 		}
1566cdf0e10cSrcweir 	}
1567cdf0e10cSrcweir 	else
1568cdf0e10cSrcweir 	{
1569cdf0e10cSrcweir 		// dann ist das eine Nummerierung
1570cdf0e10cSrcweir 
1571cdf0e10cSrcweir 		//JP 21.11.97: Der NumLevel wird entweder der DigitLevel oder
1572cdf0e10cSrcweir 		// 				wenn der nicht vorhanden oder 0 ist, durch den
1573cdf0e10cSrcweir 		//				(Einrueckungs-)Level.
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir 		String aPostFix, aPreFix, aNumTypes;
1576cdf0e10cSrcweir 		if( USHRT_MAX != ( nDigitLevel = GetDigitLevel( *pAktTxtNd, nTxtStt,
1577cdf0e10cSrcweir 										&aPreFix, &aPostFix, &aNumTypes )) )
1578cdf0e10cSrcweir 		{
1579cdf0e10cSrcweir 			bChgEnum = sal_True;
1580cdf0e10cSrcweir 
1581cdf0e10cSrcweir 			// Ebene 0 und Einrueckung dann wird die Ebene durch den linken
1582cdf0e10cSrcweir 			// Einzug und der default NumEinrueckung bestimmt.
1583cdf0e10cSrcweir 			if( !nDigitLevel && nLeftTxtPos )
1584cdf0e10cSrcweir 				nLvl = Min( sal_uInt16( nLeftTxtPos / lNumIndent ),
1585cdf0e10cSrcweir 							sal_uInt16( MAXLEVEL - 1 ) );
1586cdf0e10cSrcweir 			else
1587cdf0e10cSrcweir 				nLvl = nDigitLevel;
1588cdf0e10cSrcweir 		}
1589cdf0e10cSrcweir 
1590cdf0e10cSrcweir 		if( bChgEnum && aFlags.bSetNumRule )
1591cdf0e10cSrcweir 		{
1592cdf0e10cSrcweir 			if( !pCur )			// NumRule anpassen, wenn sie neu ist
1593cdf0e10cSrcweir 			{
1594cdf0e10cSrcweir 				SwCharFmt* pCFmt = pDoc->GetCharFmtFromPool(
1595cdf0e10cSrcweir 											RES_POOLCHR_NUM_LEVEL );
1596cdf0e10cSrcweir 				if( !nDigitLevel )
1597cdf0e10cSrcweir 				{
1598cdf0e10cSrcweir 					SwNumFmt aFmt( aRule.Get( nLvl ) );
1599cdf0e10cSrcweir 					aFmt.SetStart( static_cast<sal_uInt16>(aPreFix.GetToken( 1,
1600cdf0e10cSrcweir 											(sal_Unicode)1 ).ToInt32()));
1601cdf0e10cSrcweir 					aFmt.SetPrefix( aPreFix.GetToken( 0, (sal_Unicode)1 ));
1602cdf0e10cSrcweir 					aFmt.SetSuffix( aPostFix.GetToken( 0, (sal_Unicode)1 ));
1603cdf0e10cSrcweir 					aFmt.SetIncludeUpperLevels( 0 );
1604cdf0e10cSrcweir 
1605cdf0e10cSrcweir 					if( !aFmt.GetCharFmt() )
1606cdf0e10cSrcweir 						aFmt.SetCharFmt( pCFmt );
1607cdf0e10cSrcweir 
1608cdf0e10cSrcweir 					if( aNumTypes.Len() )
1609cdf0e10cSrcweir 						aFmt.SetNumberingType(aNumTypes.GetChar( 0 ) - '0');
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir                     if( bRTL )
1612cdf0e10cSrcweir                         aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
1613cdf0e10cSrcweir 					aRule.Set( nLvl, aFmt );
1614cdf0e10cSrcweir 				}
1615cdf0e10cSrcweir 				else
1616cdf0e10cSrcweir 				{
1617cdf0e10cSrcweir 					sal_uInt16 nSpaceSteps = nLvl ? sal_uInt16(nLeftTxtPos / nLvl) : 0;
1618cdf0e10cSrcweir                     sal_uInt8 n;
1619cdf0e10cSrcweir                     for( n = 0; n <= nLvl; ++n )
1620cdf0e10cSrcweir 					{
1621cdf0e10cSrcweir 						SwNumFmt aFmt( aRule.Get( n ) );
1622cdf0e10cSrcweir 
1623cdf0e10cSrcweir 						aFmt.SetStart( static_cast<sal_uInt16>(aPreFix.GetToken( n+1,
1624cdf0e10cSrcweir 													(sal_Unicode)1 ).ToInt32() ));
1625cdf0e10cSrcweir 						if( !n )
1626cdf0e10cSrcweir 							aFmt.SetPrefix( aPreFix.GetToken( n, (sal_Unicode)1 ));
1627cdf0e10cSrcweir 						aFmt.SetSuffix( aPostFix.GetToken( n, (sal_Unicode)1 ));
1628cdf0e10cSrcweir 						aFmt.SetIncludeUpperLevels( MAXLEVEL );
1629cdf0e10cSrcweir 						if( n < aNumTypes.Len() )
1630cdf0e10cSrcweir 							aFmt.SetNumberingType((aNumTypes.GetChar( n ) - '0'));
1631cdf0e10cSrcweir 
1632cdf0e10cSrcweir 						aFmt.SetAbsLSpace( sal_uInt16( nSpaceSteps * n )
1633cdf0e10cSrcweir 											+ lNumIndent );
1634cdf0e10cSrcweir 
1635cdf0e10cSrcweir 						if( !aFmt.GetCharFmt() )
1636cdf0e10cSrcweir 							aFmt.SetCharFmt( pCFmt );
1637cdf0e10cSrcweir                         if( bRTL )
1638cdf0e10cSrcweir                             aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
1639cdf0e10cSrcweir 
1640cdf0e10cSrcweir 						aRule.Set( n, aFmt );
1641cdf0e10cSrcweir 					}
1642cdf0e10cSrcweir 
1643cdf0e10cSrcweir 					// passt alles vollstaendig in den Frame?
1644cdf0e10cSrcweir 					sal_Bool bDefStep = nFrmWidth < (nSpaceSteps * MAXLEVEL);
1645cdf0e10cSrcweir 					for( ; n < MAXLEVEL; ++n )
1646cdf0e10cSrcweir 					{
1647cdf0e10cSrcweir 						SwNumFmt aFmt( aRule.Get( n ) );
1648cdf0e10cSrcweir 						aFmt.SetIncludeUpperLevels( MAXLEVEL );
1649cdf0e10cSrcweir 						if( bDefStep )
1650cdf0e10cSrcweir 							aFmt.SetAbsLSpace( sal_uInt16( (nLeftTxtPos +
1651cdf0e10cSrcweir                                 SwNumRule::GetNumIndent(static_cast<sal_uInt8>(n-nLvl)))));
1652cdf0e10cSrcweir 						else
1653cdf0e10cSrcweir 							aFmt.SetAbsLSpace( sal_uInt16( nSpaceSteps * n )
1654cdf0e10cSrcweir 												+ lNumIndent );
1655cdf0e10cSrcweir 						aRule.Set( n, aFmt );
1656cdf0e10cSrcweir 					}
1657cdf0e10cSrcweir 				}
1658cdf0e10cSrcweir 			}
1659cdf0e10cSrcweir 		}
1660cdf0e10cSrcweir 		else if( !aFlags.bAFmtByInput )
1661cdf0e10cSrcweir 			SetColl( static_cast<sal_uInt16>(RES_POOLCOLL_NUM_LEVEL1 + ( Min( nLvl, cnNumBullColls ) * 4 ) ));
1662cdf0e10cSrcweir 		else
1663cdf0e10cSrcweir 			bChgEnum = sal_False;
1664cdf0e10cSrcweir 	}
1665cdf0e10cSrcweir 
1666cdf0e10cSrcweir 	if( bChgEnum || bChgBullet )
1667cdf0e10cSrcweir 	{
1668cdf0e10cSrcweir 		aDelPam.DeleteMark();
1669cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode = aNdIdx;
1670cdf0e10cSrcweir 
1671cdf0e10cSrcweir 		if( aFlags.bSetNumRule )
1672cdf0e10cSrcweir 		{
1673cdf0e10cSrcweir 			if( aFlags.bAFmtByInput )
1674cdf0e10cSrcweir 			{
1675cdf0e10cSrcweir 				aDelPam.SetMark();
1676cdf0e10cSrcweir 				aDelPam.GetMark()->nNode++;
1677cdf0e10cSrcweir                 aDelPam.GetNode(sal_False)->GetTxtNode()->SetAttrListLevel( nLvl );
1678cdf0e10cSrcweir 			}
1679cdf0e10cSrcweir 
1680cdf0e10cSrcweir             pAktTxtNd->SetAttrListLevel(nLvl);
1681cdf0e10cSrcweir 			pAktTxtNd->SetNumLSpace( sal_True );
1682cdf0e10cSrcweir 
1683cdf0e10cSrcweir             // --> OD 2008-03-17 #refactorlists#
1684cdf0e10cSrcweir             // start new list
1685cdf0e10cSrcweir             pDoc->SetNumRule( aDelPam, aRule, true );
1686cdf0e10cSrcweir             // <--
1687cdf0e10cSrcweir 			aDelPam.DeleteMark();
1688cdf0e10cSrcweir 
1689cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, 0 );
1690cdf0e10cSrcweir 		}
1691cdf0e10cSrcweir 		else
1692cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent.Assign( pAktTxtNd,
1693cdf0e10cSrcweir 						bChgEnum ? (nTxtStt - nOrigTxtStt) : 0 );
1694cdf0e10cSrcweir 		aDelPam.SetMark();
1695cdf0e10cSrcweir 
1696cdf0e10cSrcweir 		if( bChgBullet )
1697cdf0e10cSrcweir 			nTxtStt += 2;
1698cdf0e10cSrcweir 
1699cdf0e10cSrcweir 		while( nTxtStt < rStr.Len() && IsSpace( rStr.GetChar( nTxtStt ) ))
1700cdf0e10cSrcweir 			nTxtStt++;
1701cdf0e10cSrcweir 
1702cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent = nTxtStt - nOrigTxtStt;
1703cdf0e10cSrcweir 		DeleteSel( aDelPam );
1704cdf0e10cSrcweir 
1705cdf0e10cSrcweir 		if( !aFlags.bSetNumRule )
1706cdf0e10cSrcweir 		{
1707cdf0e10cSrcweir 			String sChgStr( '\t' );
1708cdf0e10cSrcweir 			if( bChgBullet )
1709cdf0e10cSrcweir 				sChgStr.Insert( aFlags.cBullet, 0 );
1710cdf0e10cSrcweir             pDoc->InsertString( aDelPam, sChgStr );
1711cdf0e10cSrcweir 
1712cdf0e10cSrcweir 			SfxItemSet aSet( pDoc->GetAttrPool(), aTxtNodeSetRange );
1713cdf0e10cSrcweir 			if( bChgBullet )
1714cdf0e10cSrcweir 			{
1715cdf0e10cSrcweir 				aDelPam.GetPoint()->nContent = 0;
1716cdf0e10cSrcweir 				aDelPam.SetMark();
1717cdf0e10cSrcweir 				aDelPam.GetMark()->nContent = 1;
1718cdf0e10cSrcweir 				SetAllScriptItem( aSet,
1719cdf0e10cSrcweir 					 SvxFontItem( aFlags.aBulletFont.GetFamily(),
1720cdf0e10cSrcweir 								  aFlags.aBulletFont.GetName(),
1721cdf0e10cSrcweir 								  aFlags.aBulletFont.GetStyleName(),
1722cdf0e10cSrcweir 								  aFlags.aBulletFont.GetPitch(),
1723cdf0e10cSrcweir                                   aFlags.aBulletFont.GetCharSet(),
1724cdf0e10cSrcweir                                   RES_CHRATR_FONT ) );
1725cdf0e10cSrcweir 				pDoc->SetFmtItemByAutoFmt( aDelPam, aSet );
1726cdf0e10cSrcweir 				aDelPam.DeleteMark();
1727cdf0e10cSrcweir 				nAutoCorrPos = 2;
1728cdf0e10cSrcweir 				aSet.ClearItem();
1729cdf0e10cSrcweir 			}
1730cdf0e10cSrcweir             SvxTabStopItem aTStops( RES_PARATR_TABSTOP );    aTStops.Insert( SvxTabStop( 0 ));
1731cdf0e10cSrcweir 			aSet.Put( aTStops );
1732cdf0e10cSrcweir 			pDoc->SetFmtItemByAutoFmt( aDelPam, aSet );
1733cdf0e10cSrcweir 		}
1734cdf0e10cSrcweir 	}
1735cdf0e10cSrcweir 
1736cdf0e10cSrcweir 	if( bBreak )
1737cdf0e10cSrcweir 	{
1738cdf0e10cSrcweir 		AutoCorrect( nAutoCorrPos );	   /* Offset wegen Bullet + Tab */
1739cdf0e10cSrcweir 		return;
1740cdf0e10cSrcweir 	}
1741cdf0e10cSrcweir 
1742cdf0e10cSrcweir 	const SwTxtNode* pNxtNd = GetNextNode();
1743cdf0e10cSrcweir 	while( CanJoin( pNxtNd ) &&
1744cdf0e10cSrcweir 			nLvl == CalcLevel( *pNxtNd ) )
1745cdf0e10cSrcweir 	{
1746cdf0e10cSrcweir 		SetRedlineTxt( STR_AUTOFMTREDL_DEL_MORELINES );
1747cdf0e10cSrcweir 		bBreak = !IsFastFullLine( *pNxtNd ) || IsBlanksInString( *pNxtNd ) ||
1748cdf0e10cSrcweir 				IsSentenceAtEnd( *pNxtNd );
1749cdf0e10cSrcweir 		if( DeleteAktNxtPara( pNxtNd->GetTxt() ) )
1750cdf0e10cSrcweir         {
1751cdf0e10cSrcweir             pDoc->InsertString( aDelPam, sal_Unicode(' ') );
1752cdf0e10cSrcweir         }
1753cdf0e10cSrcweir 		if( bBreak )
1754cdf0e10cSrcweir 			break;
1755cdf0e10cSrcweir         const SwTxtNode* pCurrNode = pNxtNd;
1756cdf0e10cSrcweir 		pNxtNd = GetNextNode();
1757cdf0e10cSrcweir         if(!pNxtNd || pCurrNode == pNxtNd)
1758cdf0e10cSrcweir             break;
1759cdf0e10cSrcweir 	}
1760cdf0e10cSrcweir 	DeleteAktPara( sal_False, sal_True );
1761cdf0e10cSrcweir 	AutoCorrect( nAutoCorrPos );
1762cdf0e10cSrcweir }
1763cdf0e10cSrcweir 
1764cdf0e10cSrcweir 
BuildNegIndent(SwTwips nSpaces)1765cdf0e10cSrcweir void SwAutoFormat::BuildNegIndent( SwTwips nSpaces )
1766cdf0e10cSrcweir {
1767cdf0e10cSrcweir 	SetRedlineTxt( STR_AUTOFMTREDL_SET_TMPL_NEG_INDENT );
1768cdf0e10cSrcweir 	// Test auf Gegenueberstellung:
1769cdf0e10cSrcweir 	// (n Worte, durch Space/Tabs getrennt, mit gleicher
1770cdf0e10cSrcweir 	//   Einrueckung in der 2.Zeile)
1771cdf0e10cSrcweir 
1772cdf0e10cSrcweir 	// lese alle nachfolgenden Absaetze die zu dieser Aufzaehlung gehoeren
1773cdf0e10cSrcweir 	sal_Bool bBreak = sal_True;
1774cdf0e10cSrcweir 	xub_StrLen nSpacePos, nTxtPos = GetBigIndent( nSpacePos );
1775cdf0e10cSrcweir 	if( bMoreLines )
1776cdf0e10cSrcweir 		DelMoreLinesBlanks( sal_True );
1777cdf0e10cSrcweir 	else
1778cdf0e10cSrcweir 		bBreak = !IsFastFullLine( *pAktTxtNd ) ||
1779cdf0e10cSrcweir 					( !nTxtPos && IsBlanksInString( *pAktTxtNd )) ||
1780cdf0e10cSrcweir 					IsSentenceAtEnd( *pAktTxtNd );
1781cdf0e10cSrcweir 
1782cdf0e10cSrcweir 	SetColl( static_cast<sal_uInt16>( nTxtPos
1783cdf0e10cSrcweir 				? RES_POOLCOLL_CONFRONTATION
1784cdf0e10cSrcweir 				: RES_POOLCOLL_TEXT_NEGIDENT ) );
1785cdf0e10cSrcweir 
1786cdf0e10cSrcweir 	if( nTxtPos )
1787cdf0e10cSrcweir 	{
1788cdf0e10cSrcweir 		const String& rStr = pAktTxtNd->GetTxt();
1789cdf0e10cSrcweir 		sal_Bool bInsTab = sal_True;
1790cdf0e10cSrcweir 
1791cdf0e10cSrcweir 		if( '\t' == rStr.GetChar( nSpacePos+1 ))       // ein Tab, das belassen wir
1792cdf0e10cSrcweir 		{
1793cdf0e10cSrcweir 			--nSpacePos;
1794cdf0e10cSrcweir 			bInsTab = sal_False;
1795cdf0e10cSrcweir 		}
1796cdf0e10cSrcweir 
1797cdf0e10cSrcweir 		xub_StrLen nSpaceStt = nSpacePos;
1798cdf0e10cSrcweir 		while( nSpaceStt && IsSpace( rStr.GetChar( --nSpaceStt ) ) )
1799cdf0e10cSrcweir 			;
1800cdf0e10cSrcweir 		++nSpaceStt;
1801cdf0e10cSrcweir 
1802cdf0e10cSrcweir 		if( bInsTab && '\t' == rStr.GetChar( nSpaceStt ) )		// ein Tab, das belassen wir
1803cdf0e10cSrcweir 		{
1804cdf0e10cSrcweir 			++nSpaceStt;
1805cdf0e10cSrcweir 			bInsTab = sal_False;
1806cdf0e10cSrcweir 		}
1807cdf0e10cSrcweir 
1808cdf0e10cSrcweir 
1809cdf0e10cSrcweir 		aDelPam.DeleteMark();
1810cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode = aNdIdx;
1811cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, nSpacePos );
1812cdf0e10cSrcweir 
1813cdf0e10cSrcweir 		// alten Spaces, usw. loeschen
1814cdf0e10cSrcweir 		if( nSpaceStt < nSpacePos )
1815cdf0e10cSrcweir 		{
1816cdf0e10cSrcweir 			aDelPam.SetMark();
1817cdf0e10cSrcweir 			aDelPam.GetMark()->nContent = nSpaceStt;
1818cdf0e10cSrcweir 			DeleteSel( aDelPam );
1819cdf0e10cSrcweir 			if( bInsTab )
1820cdf0e10cSrcweir             {
1821cdf0e10cSrcweir                 pDoc->InsertString( aDelPam, sal_Unicode('\t') );
1822cdf0e10cSrcweir             }
1823cdf0e10cSrcweir         }
1824cdf0e10cSrcweir     }
1825cdf0e10cSrcweir 
1826cdf0e10cSrcweir 	if( !bBreak )
1827cdf0e10cSrcweir 	{
1828cdf0e10cSrcweir 		SetRedlineTxt( STR_AUTOFMTREDL_DEL_MORELINES );
1829cdf0e10cSrcweir 		SwTxtFrmInfo aFInfo( pAktTxtFrm );
1830cdf0e10cSrcweir 		const SwTxtNode* pNxtNd = GetNextNode();
1831cdf0e10cSrcweir 		while(	CanJoin( pNxtNd ) &&
1832cdf0e10cSrcweir 				20 < Abs( (long)(nSpaces - aFInfo.SetFrm(
1833cdf0e10cSrcweir 								GetFrm( *pNxtNd ) ).GetLineStart() ))
1834cdf0e10cSrcweir 			)
1835cdf0e10cSrcweir 		{
1836cdf0e10cSrcweir 			bBreak = !IsFastFullLine( *pNxtNd ) ||
1837cdf0e10cSrcweir 					IsBlanksInString( *pNxtNd ) ||
1838cdf0e10cSrcweir 					IsSentenceAtEnd( *pNxtNd );
1839cdf0e10cSrcweir 			if( DeleteAktNxtPara( pNxtNd->GetTxt() ) )
1840cdf0e10cSrcweir             {
1841cdf0e10cSrcweir                 pDoc->InsertString( aDelPam, sal_Unicode(' ') );
1842cdf0e10cSrcweir             }
1843cdf0e10cSrcweir 			if( bBreak )
1844cdf0e10cSrcweir 				break;
1845cdf0e10cSrcweir 			pNxtNd = GetNextNode();
1846cdf0e10cSrcweir 		}
1847cdf0e10cSrcweir 	}
1848cdf0e10cSrcweir 	DeleteAktPara( sal_True, sal_True );
1849cdf0e10cSrcweir 	AutoCorrect();
1850cdf0e10cSrcweir }
1851cdf0e10cSrcweir 
1852cdf0e10cSrcweir 
BuildHeadLine(sal_uInt16 nLvl)1853cdf0e10cSrcweir void SwAutoFormat::BuildHeadLine( sal_uInt16 nLvl )
1854cdf0e10cSrcweir {
1855cdf0e10cSrcweir 	if( aFlags.bWithRedlining )
1856cdf0e10cSrcweir 	{
1857cdf0e10cSrcweir 		String sTxt( *ViewShell::GetShellRes()->GetAutoFmtNameLst()[
1858cdf0e10cSrcweir 									STR_AUTOFMTREDL_SET_TMPL_HEADLINE ] );
1859cdf0e10cSrcweir 		sTxt.SearchAndReplace( String::CreateFromAscii(
1860cdf0e10cSrcweir 									RTL_CONSTASCII_STRINGPARAM( "$(ARG1)" )),
1861cdf0e10cSrcweir 								String::CreateFromInt32( nLvl + 1 ) );
1862cdf0e10cSrcweir 		pDoc->SetAutoFmtRedlineComment( &sTxt );
1863cdf0e10cSrcweir 	}
1864cdf0e10cSrcweir 
1865cdf0e10cSrcweir 	SetColl( static_cast<sal_uInt16>(RES_POOLCOLL_HEADLINE1 + nLvl ), sal_True );
1866cdf0e10cSrcweir 	if( aFlags.bAFmtByInput )
1867cdf0e10cSrcweir 	{
1868cdf0e10cSrcweir 		SwTxtFmtColl& rNxtColl = pAktTxtNd->GetTxtColl()->GetNextTxtFmtColl();
1869cdf0e10cSrcweir 
1870cdf0e10cSrcweir 		DelPrevPara();
1871cdf0e10cSrcweir 
1872cdf0e10cSrcweir 		DeleteAktPara( sal_True, sal_False );
1873cdf0e10cSrcweir 		DeleteAktNxtPara( aEmptyStr );
1874cdf0e10cSrcweir 
1875cdf0e10cSrcweir 		aDelPam.DeleteMark();
1876cdf0e10cSrcweir 		aDelPam.GetPoint()->nNode = aNdIdx.GetIndex() + 1;
1877cdf0e10cSrcweir 		aDelPam.GetPoint()->nContent.Assign( aDelPam.GetCntntNode(), 0 );
1878cdf0e10cSrcweir 		pDoc->SetTxtFmtColl( aDelPam, &rNxtColl );
1879cdf0e10cSrcweir 	}
1880cdf0e10cSrcweir 	else
1881cdf0e10cSrcweir 	{
1882cdf0e10cSrcweir 		DeleteAktPara( sal_True, sal_True );
1883cdf0e10cSrcweir 		AutoCorrect();
1884cdf0e10cSrcweir 	}
1885cdf0e10cSrcweir }
1886cdf0e10cSrcweir 
1887cdf0e10cSrcweir 
1888cdf0e10cSrcweir 		// dann lasse doch mal das AutoCorrect auf den akt. TextNode los
AutoCorrect(xub_StrLen nPos)1889cdf0e10cSrcweir void SwAutoFormat::AutoCorrect( xub_StrLen nPos )
1890cdf0e10cSrcweir {
1891cdf0e10cSrcweir 	SvxAutoCorrect* pATst = SvxAutoCorrCfg::Get()->GetAutoCorrect();
1892cdf0e10cSrcweir     long aSvxFlags = pATst->GetFlags( );
1893cdf0e10cSrcweir     bool bReplaceQuote = ( aSvxFlags & ChgQuotes ) > 0;
1894cdf0e10cSrcweir     bool bReplaceSglQuote = ( aSvxFlags & ChgSglQuotes ) > 0;
1895cdf0e10cSrcweir 
1896cdf0e10cSrcweir 	if( aFlags.bAFmtByInput ||
1897cdf0e10cSrcweir 		(!aFlags.bAutoCorrect && !bReplaceQuote && !bReplaceSglQuote &&
1898cdf0e10cSrcweir 		!aFlags.bCptlSttSntnc && !aFlags.bCptlSttWrd &&
1899cdf0e10cSrcweir 		!aFlags.bChgOrdinalNumber &&
1900cdf0e10cSrcweir 		!aFlags.bChgToEnEmDash && !aFlags.bSetINetAttr &&
1901cdf0e10cSrcweir 		!aFlags.bChgWeightUnderl && !aFlags.bAddNonBrkSpace) )
1902cdf0e10cSrcweir 		return;
1903cdf0e10cSrcweir 
1904cdf0e10cSrcweir 	const String* pTxt = &pAktTxtNd->GetTxt();
1905cdf0e10cSrcweir 	if( nPos >= pTxt->Len() )
1906cdf0e10cSrcweir 		return;
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir 	sal_Bool bGetLanguage = aFlags.bChgOrdinalNumber ||
1909cdf0e10cSrcweir 						aFlags.bChgToEnEmDash || aFlags.bSetINetAttr ||
1910cdf0e10cSrcweir 						aFlags.bCptlSttWrd || aFlags.bCptlSttSntnc ||
1911cdf0e10cSrcweir                         aFlags.bAddNonBrkSpace;
1912cdf0e10cSrcweir 
1913cdf0e10cSrcweir 
1914cdf0e10cSrcweir 	aDelPam.DeleteMark();
1915cdf0e10cSrcweir 	aDelPam.GetPoint()->nNode = aNdIdx;
1916cdf0e10cSrcweir 	aDelPam.GetPoint()->nContent.Assign( pAktTxtNd, 0 );
1917cdf0e10cSrcweir 
1918cdf0e10cSrcweir 	SwAutoCorrDoc aACorrDoc( *pEditShell, aDelPam );
1919cdf0e10cSrcweir 
1920cdf0e10cSrcweir 	SwTxtFrmInfo aFInfo( 0 );
1921cdf0e10cSrcweir 
1922cdf0e10cSrcweir 	xub_StrLen nSttPos, nLastBlank = nPos;
1923cdf0e10cSrcweir 	sal_Bool bFirst = aFlags.bCptlSttSntnc, bFirstSent = bFirst;
1924cdf0e10cSrcweir     sal_Unicode cChar = 0;
1925cdf0e10cSrcweir 
1926cdf0e10cSrcweir 	CharClass& rAppCC = GetAppCharClass();
1927cdf0e10cSrcweir 
1928cdf0e10cSrcweir 	do {
1929cdf0e10cSrcweir 		while( nPos < pTxt->Len() && IsSpace( cChar = pTxt->GetChar( nPos ) ))
1930cdf0e10cSrcweir 			++nPos;
1931cdf0e10cSrcweir 		if( nPos == pTxt->Len() )
1932cdf0e10cSrcweir 			break;		// das wars
1933cdf0e10cSrcweir 
1934cdf0e10cSrcweir 		if( ( ( bReplaceQuote && '\"' == cChar ) ||
1935cdf0e10cSrcweir               ( bReplaceSglQuote && '\'' == cChar ) ) &&
1936cdf0e10cSrcweir 			( !nPos || ' ' == pTxt->GetChar( nPos-1 ) ) )
1937cdf0e10cSrcweir 		{
1938cdf0e10cSrcweir 			// --------------------------------------
1939cdf0e10cSrcweir 			// beachte: Sonderfall Symbolfonts !!!
1940cdf0e10cSrcweir 			if( !aFInfo.GetFrm() )
1941cdf0e10cSrcweir 				aFInfo.SetFrm( GetFrm( *pAktTxtNd ) );
1942cdf0e10cSrcweir 			if( !aFInfo.IsBullet( nPos ))
1943cdf0e10cSrcweir 			{
1944cdf0e10cSrcweir 				SetRedlineTxt( STR_AUTOFMTREDL_TYPO );
1945cdf0e10cSrcweir 				aDelPam.GetPoint()->nContent = nPos;
1946cdf0e10cSrcweir 				sal_Bool bSetHardBlank = sal_False;
1947cdf0e10cSrcweir 
1948cdf0e10cSrcweir 				String sReplace( pATst->GetQuote( aACorrDoc,
1949cdf0e10cSrcweir 									nPos, cChar, sal_True ));
1950cdf0e10cSrcweir 
1951cdf0e10cSrcweir 				aDelPam.SetMark();
1952cdf0e10cSrcweir 				aDelPam.GetPoint()->nContent = nPos+1;
1953cdf0e10cSrcweir 				if( 2 == sReplace.Len() && ' ' == sReplace.GetChar( 1 ))
1954cdf0e10cSrcweir 				{
1955cdf0e10cSrcweir 					sReplace.Erase( 1 );
1956cdf0e10cSrcweir 					bSetHardBlank = sal_True;
1957cdf0e10cSrcweir 				}
1958cdf0e10cSrcweir                 pDoc->ReplaceRange( aDelPam, sReplace, false );
1959cdf0e10cSrcweir 
1960cdf0e10cSrcweir 				if( aFlags.bWithRedlining )
1961cdf0e10cSrcweir 				{
1962cdf0e10cSrcweir 					aNdIdx = aDelPam.GetPoint()->nNode;
1963cdf0e10cSrcweir 					pAktTxtNd = aNdIdx.GetNode().GetTxtNode();
1964cdf0e10cSrcweir 					pTxt = &pAktTxtNd->GetTxt();
1965cdf0e10cSrcweir 					aDelPam.SetMark();
1966cdf0e10cSrcweir 					aFInfo.SetFrm( 0 );
1967cdf0e10cSrcweir 				}
1968cdf0e10cSrcweir 
1969cdf0e10cSrcweir 				nPos += sReplace.Len() - 1;
1970cdf0e10cSrcweir 				aDelPam.DeleteMark();
1971cdf0e10cSrcweir 				if( bSetHardBlank )
1972cdf0e10cSrcweir 				{
1973cdf0e10cSrcweir                     pDoc->InsertString( aDelPam, CHAR_HARDBLANK );
1974cdf0e10cSrcweir 					++nPos;
1975cdf0e10cSrcweir 				}
1976cdf0e10cSrcweir 			}
1977cdf0e10cSrcweir 		}
1978cdf0e10cSrcweir 
1979cdf0e10cSrcweir 		int bCallACorr = sal_False;
1980cdf0e10cSrcweir 		int bBreak = 0;
1981cdf0e10cSrcweir 		if( nPos && IsSpace( pTxt->GetChar( nPos-1 )))
1982cdf0e10cSrcweir 			nLastBlank = nPos;
1983cdf0e10cSrcweir 		for( nSttPos = nPos; !bBreak && nPos < pTxt->Len(); ++nPos )
1984cdf0e10cSrcweir 			switch( cChar = pTxt->GetChar( nPos ) )
1985cdf0e10cSrcweir 			{
1986cdf0e10cSrcweir 			case '\"':
1987cdf0e10cSrcweir 			case '\'':
1988cdf0e10cSrcweir 				if( ( cChar == '\"' && bReplaceQuote ) || ( cChar == '\'' && bReplaceSglQuote ) )
1989cdf0e10cSrcweir 				{
1990cdf0e10cSrcweir 					// --------------------------------------
1991cdf0e10cSrcweir 					// beachte: Sonderfall Symbolfonts !!!
1992cdf0e10cSrcweir 					if( !aFInfo.GetFrm() )
1993cdf0e10cSrcweir 						aFInfo.SetFrm( GetFrm( *pAktTxtNd ) );
1994cdf0e10cSrcweir 					if( !aFInfo.IsBullet( nPos ))
1995cdf0e10cSrcweir 					{
1996cdf0e10cSrcweir 						SetRedlineTxt( STR_AUTOFMTREDL_TYPO );
1997cdf0e10cSrcweir 						sal_Bool bSetHardBlank = sal_False;
1998cdf0e10cSrcweir 						aDelPam.GetPoint()->nContent = nPos;
1999cdf0e10cSrcweir 						String sReplace( pATst->GetQuote( aACorrDoc,
2000cdf0e10cSrcweir 													nPos, cChar, sal_False ));
2001cdf0e10cSrcweir 
2002cdf0e10cSrcweir 						if( 2 == sReplace.Len() && ' ' == sReplace.GetChar( 0 ))
2003cdf0e10cSrcweir 						{
2004cdf0e10cSrcweir 							sReplace.Erase( 0, 1 );
2005cdf0e10cSrcweir 							bSetHardBlank = sal_True;
2006cdf0e10cSrcweir 						}
2007cdf0e10cSrcweir 
2008cdf0e10cSrcweir 						aDelPam.SetMark();
2009cdf0e10cSrcweir 						aDelPam.GetPoint()->nContent = nPos+1;
2010cdf0e10cSrcweir                         pDoc->ReplaceRange( aDelPam, sReplace, false );
2011cdf0e10cSrcweir 
2012cdf0e10cSrcweir 						if( aFlags.bWithRedlining )
2013cdf0e10cSrcweir 						{
2014cdf0e10cSrcweir 							aNdIdx = aDelPam.GetPoint()->nNode;
2015cdf0e10cSrcweir 							pAktTxtNd = aNdIdx.GetNode().GetTxtNode();
2016cdf0e10cSrcweir 							pTxt = &pAktTxtNd->GetTxt();
2017cdf0e10cSrcweir 							aDelPam.SetMark();
2018cdf0e10cSrcweir 							aDelPam.DeleteMark();
2019cdf0e10cSrcweir 							aFInfo.SetFrm( 0 );
2020cdf0e10cSrcweir 						}
2021cdf0e10cSrcweir 
2022cdf0e10cSrcweir 						nPos += sReplace.Len() - 1;
2023cdf0e10cSrcweir 						aDelPam.DeleteMark();
2024cdf0e10cSrcweir 
2025cdf0e10cSrcweir 						if( bSetHardBlank )
2026cdf0e10cSrcweir 						{
2027cdf0e10cSrcweir 							aDelPam.GetPoint()->nContent = nPos;
2028cdf0e10cSrcweir                             pDoc->InsertString( aDelPam, CHAR_HARDBLANK );
2029cdf0e10cSrcweir 							aDelPam.GetPoint()->nContent = ++nPos;
2030cdf0e10cSrcweir 						}
2031cdf0e10cSrcweir 					}
2032cdf0e10cSrcweir 				}
2033cdf0e10cSrcweir 				break;
2034cdf0e10cSrcweir 			case '*':
2035cdf0e10cSrcweir 			case '_':
2036cdf0e10cSrcweir 				if( aFlags.bChgWeightUnderl )
2037cdf0e10cSrcweir 				{
2038cdf0e10cSrcweir 					// --------------------------------------
2039cdf0e10cSrcweir 					// beachte: Sonderfall Symbolfonts !!!
2040cdf0e10cSrcweir 					if( !aFInfo.GetFrm() )
2041cdf0e10cSrcweir 						aFInfo.SetFrm( GetFrm( *pAktTxtNd ) );
2042cdf0e10cSrcweir 					if( !aFInfo.IsBullet( nPos ))
2043cdf0e10cSrcweir 					{
2044cdf0e10cSrcweir 						SetRedlineTxt( '*' == cChar
2045cdf0e10cSrcweir 											? STR_AUTOFMTREDL_BOLD
2046cdf0e10cSrcweir 											: STR_AUTOFMTREDL_UNDER );
2047cdf0e10cSrcweir 
2048cdf0e10cSrcweir 						sal_Unicode cBlank = nSttPos ? pTxt->GetChar(nSttPos - 1) : 0;
2049cdf0e10cSrcweir 						aDelPam.GetPoint()->nContent = nPos;
2050cdf0e10cSrcweir 
2051cdf0e10cSrcweir 						if( pATst->FnChgWeightUnderl( aACorrDoc, *pTxt,
2052cdf0e10cSrcweir 															nSttPos, nPos ))
2053cdf0e10cSrcweir 						{
2054cdf0e10cSrcweir                             if( aFlags.bWithRedlining )
2055cdf0e10cSrcweir                             {
2056cdf0e10cSrcweir                                 aNdIdx = aDelPam.GetPoint()->nNode;
2057cdf0e10cSrcweir                                 pAktTxtNd = aNdIdx.GetNode().GetTxtNode();
2058cdf0e10cSrcweir                                 pTxt = &pAktTxtNd->GetTxt();
2059cdf0e10cSrcweir                                 aDelPam.SetMark();
2060cdf0e10cSrcweir                                 aDelPam.DeleteMark();
2061cdf0e10cSrcweir                                 aFInfo.SetFrm( 0 );
2062cdf0e10cSrcweir                             }
2063cdf0e10cSrcweir                             //#125102# in case of the mode REDLINE_SHOW_DELETE the ** are still contained in pTxt
2064cdf0e10cSrcweir                             if(0 == (pDoc->GetRedlineMode() & nsRedlineMode_t::REDLINE_SHOW_DELETE))
2065cdf0e10cSrcweir                                 nPos = aDelPam.GetPoint()->nContent.GetIndex() - 1;
2066cdf0e10cSrcweir 							// wurde vorm Start ein Zeichen entfernt?
2067cdf0e10cSrcweir 							if( cBlank && cBlank != pTxt->GetChar(nSttPos - 1) )
2068cdf0e10cSrcweir 								--nSttPos;
2069cdf0e10cSrcweir 						}
2070cdf0e10cSrcweir 					}
2071cdf0e10cSrcweir 				}
2072cdf0e10cSrcweir 				break;
2073cdf0e10cSrcweir             case '/':
2074cdf0e10cSrcweir                 if ( aFlags.bAddNonBrkSpace )
2075cdf0e10cSrcweir                 {
2076cdf0e10cSrcweir 			        LanguageType eLang = (bGetLanguage && pAktTxtNd)
2077cdf0e10cSrcweir 										   ? pAktTxtNd->GetLang( nSttPos )
2078cdf0e10cSrcweir 										   : LANGUAGE_SYSTEM;
2079cdf0e10cSrcweir 
2080cdf0e10cSrcweir                     SetRedlineTxt( STR_AUTOFMTREDL_NON_BREAK_SPACE );
2081cdf0e10cSrcweir                     if ( pATst->FnAddNonBrkSpace( aACorrDoc, *pTxt, nSttPos, nPos, eLang ) )
2082cdf0e10cSrcweir                         --nPos;
2083cdf0e10cSrcweir                 }
2084cdf0e10cSrcweir                 break;
2085cdf0e10cSrcweir 
2086cdf0e10cSrcweir 			case '.':
2087cdf0e10cSrcweir 			case '!':
2088cdf0e10cSrcweir 			case '?':
2089cdf0e10cSrcweir 				if( aFlags.bCptlSttSntnc )
2090cdf0e10cSrcweir 					bFirstSent = sal_True;
2091cdf0e10cSrcweir //alle Wortrenner loesen die Autokorrektur aus!
2092cdf0e10cSrcweir //				break;
2093cdf0e10cSrcweir 			default:
2094cdf0e10cSrcweir //alle Wortrenner loesen die Autokorrektur aus!
2095cdf0e10cSrcweir //			case ' ':
2096cdf0e10cSrcweir //			case '\t':
2097cdf0e10cSrcweir 				if( !( rAppCC.isLetterNumeric( *pTxt, nPos )
2098cdf0e10cSrcweir                         || '/' == cChar )) //  '/' should not be a word seperator (e.g. '1/2' needs to be handled as one word for replacement)
2099cdf0e10cSrcweir 				{
2100cdf0e10cSrcweir 					--nPos;		// ++nPos von dem for ungueltig machen !
2101cdf0e10cSrcweir 					++bBreak;
2102cdf0e10cSrcweir 				}
2103cdf0e10cSrcweir 				break;
2104cdf0e10cSrcweir 			}
2105cdf0e10cSrcweir 
2106cdf0e10cSrcweir 		if( nPos == nSttPos )
2107cdf0e10cSrcweir 		{
2108cdf0e10cSrcweir 			if( ++nPos == pTxt->Len() )
2109cdf0e10cSrcweir 				bCallACorr = sal_True;
2110cdf0e10cSrcweir 		}
2111cdf0e10cSrcweir 		else
2112cdf0e10cSrcweir 			bCallACorr = sal_True;
2113cdf0e10cSrcweir 
2114cdf0e10cSrcweir 
2115cdf0e10cSrcweir 		if( bCallACorr )
2116cdf0e10cSrcweir 		{
2117cdf0e10cSrcweir 			bCallACorr = sal_False;
2118cdf0e10cSrcweir 			aDelPam.GetPoint()->nContent = nPos;
2119cdf0e10cSrcweir 			SetRedlineTxt( STR_AUTOFMTREDL_USE_REPLACE );
2120cdf0e10cSrcweir 			if( aFlags.bAutoCorrect &&
2121cdf0e10cSrcweir 				aACorrDoc.ChgAutoCorrWord( nSttPos, nPos, *pATst, 0 ) )
2122cdf0e10cSrcweir 			{
2123cdf0e10cSrcweir 				nPos = aDelPam.GetPoint()->nContent.GetIndex();
2124cdf0e10cSrcweir 
2125cdf0e10cSrcweir 				if( aFlags.bWithRedlining )
2126cdf0e10cSrcweir 				{
2127cdf0e10cSrcweir 					aNdIdx = aDelPam.GetPoint()->nNode;
2128cdf0e10cSrcweir 					pAktTxtNd = aNdIdx.GetNode().GetTxtNode();
2129cdf0e10cSrcweir 					pTxt = &pAktTxtNd->GetTxt();
2130cdf0e10cSrcweir 					aDelPam.SetMark();
2131cdf0e10cSrcweir 					aDelPam.DeleteMark();
2132cdf0e10cSrcweir 				}
2133cdf0e10cSrcweir 
2134cdf0e10cSrcweir 				continue;		// nichts weiter mehr abpruefen
2135cdf0e10cSrcweir 			}
2136cdf0e10cSrcweir 
2137cdf0e10cSrcweir 			LanguageType eLang = (bGetLanguage && pAktTxtNd)
2138cdf0e10cSrcweir 										   ? pAktTxtNd->GetLang( nSttPos )
2139cdf0e10cSrcweir 										   : LANGUAGE_SYSTEM;
2140cdf0e10cSrcweir 
2141cdf0e10cSrcweir             if ( aFlags.bAddNonBrkSpace )
2142cdf0e10cSrcweir             {
2143cdf0e10cSrcweir                 SetRedlineTxt( STR_AUTOFMTREDL_NON_BREAK_SPACE );
2144cdf0e10cSrcweir                 pATst->FnAddNonBrkSpace( aACorrDoc, *pTxt, nSttPos, nPos, eLang );
2145cdf0e10cSrcweir             }
2146cdf0e10cSrcweir 
2147cdf0e10cSrcweir 			if( ( aFlags.bChgOrdinalNumber &&
2148cdf0e10cSrcweir 					SetRedlineTxt( STR_AUTOFMTREDL_ORDINAL ) &&
2149cdf0e10cSrcweir 					pATst->FnChgOrdinalNumber( aACorrDoc, *pTxt, nSttPos, nPos, eLang ) ) ||
2150cdf0e10cSrcweir 				( aFlags.bChgToEnEmDash &&
2151cdf0e10cSrcweir 					SetRedlineTxt( STR_AUTOFMTREDL_DASH ) &&
2152cdf0e10cSrcweir 					pATst->FnChgToEnEmDash( aACorrDoc, *pTxt, nSttPos, nPos, eLang ) ) ||
2153cdf0e10cSrcweir 				( aFlags.bSetINetAttr &&
2154cdf0e10cSrcweir 					( nPos == pTxt->Len() || IsSpace( pTxt->GetChar( nPos )) ) &&
2155cdf0e10cSrcweir 					SetRedlineTxt( STR_AUTOFMTREDL_DETECT_URL ) &&
2156cdf0e10cSrcweir 					pATst->FnSetINetAttr( aACorrDoc, *pTxt, nLastBlank, nPos, eLang ) ) )
2157cdf0e10cSrcweir 					nPos = aDelPam.GetPoint()->nContent.GetIndex();
2158cdf0e10cSrcweir 			else
2159cdf0e10cSrcweir 			{
2160cdf0e10cSrcweir 				// Zwei Grossbuchstaben am Wort-Anfang ??
2161cdf0e10cSrcweir 				if( aFlags.bCptlSttWrd )
2162cdf0e10cSrcweir 				{
2163cdf0e10cSrcweir 					SetRedlineTxt( STR_AUTOFMTREDL_CPTL_STT_WORD );
2164cdf0e10cSrcweir 					pATst->FnCptlSttWrd( aACorrDoc, *pTxt, nSttPos, nPos, eLang );
2165cdf0e10cSrcweir 				}
2166cdf0e10cSrcweir 				// Grossbuchstabe am Satz-Anfang ??
2167cdf0e10cSrcweir 				if( aFlags.bCptlSttSntnc && bFirst )
2168cdf0e10cSrcweir 				{
2169cdf0e10cSrcweir 					SetRedlineTxt( STR_AUTOFMTREDL_CPTL_STT_SENT );
2170cdf0e10cSrcweir 					pATst->FnCptlSttSntnc( aACorrDoc, *pTxt, sal_True, nSttPos, nPos, eLang);
2171cdf0e10cSrcweir 					bFirst = sal_False;
2172cdf0e10cSrcweir 				}
2173cdf0e10cSrcweir 
2174cdf0e10cSrcweir 				bFirst = bFirstSent;
2175cdf0e10cSrcweir 				bFirstSent = sal_False;
2176cdf0e10cSrcweir 
2177cdf0e10cSrcweir 				if( aFlags.bWithRedlining )
2178cdf0e10cSrcweir 				{
2179cdf0e10cSrcweir 					aNdIdx = aDelPam.GetPoint()->nNode;
2180cdf0e10cSrcweir 					pAktTxtNd = aNdIdx.GetNode().GetTxtNode();
2181cdf0e10cSrcweir 					pTxt = &pAktTxtNd->GetTxt();
2182cdf0e10cSrcweir 					aDelPam.SetMark();
2183cdf0e10cSrcweir 					aDelPam.DeleteMark();
2184cdf0e10cSrcweir 				}
2185cdf0e10cSrcweir 			}
2186cdf0e10cSrcweir 		}
2187cdf0e10cSrcweir 	} while( nPos < pTxt->Len() );
2188cdf0e10cSrcweir 	ClearRedlineTxt();
2189cdf0e10cSrcweir }
2190cdf0e10cSrcweir 
2191cdf0e10cSrcweir 
SwAutoFormat(SwEditShell * pEdShell,SvxSwAutoFmtFlags & rFlags,SwNodeIndex * pSttNd,SwNodeIndex * pEndNd)2192cdf0e10cSrcweir SwAutoFormat::SwAutoFormat( SwEditShell* pEdShell, SvxSwAutoFmtFlags& rFlags,
2193cdf0e10cSrcweir 							SwNodeIndex* pSttNd, SwNodeIndex* pEndNd )
2194cdf0e10cSrcweir 	: aFlags( rFlags ),
2195cdf0e10cSrcweir 	aDelPam( pEdShell->GetDoc()->GetNodes().GetEndOfExtras() ),
2196cdf0e10cSrcweir 	aNdIdx( pEdShell->GetDoc()->GetNodes().GetEndOfExtras(), +1 ),
2197cdf0e10cSrcweir 	aEndNdIdx( pEdShell->GetDoc()->GetNodes().GetEndOfContent() ),
2198cdf0e10cSrcweir 	pEditShell( pEdShell ),
2199cdf0e10cSrcweir 	pDoc( pEdShell->GetDoc() ),
2200cdf0e10cSrcweir 	pAktTxtNd( 0 ), pAktTxtFrm( 0 ),
2201cdf0e10cSrcweir 	pCharClass( 0 ),
2202cdf0e10cSrcweir 	nRedlAutoFmtSeqId( 0 )
2203cdf0e10cSrcweir {
2204cdf0e10cSrcweir 	ASSERT( (pSttNd && pEndNd) || (!pSttNd && !pEndNd),
2205cdf0e10cSrcweir 			"Kein Bereich angegeben" );
2206cdf0e10cSrcweir 
2207cdf0e10cSrcweir 	if( aFlags.bSetNumRule && !aFlags.bAFmtByInput )
2208cdf0e10cSrcweir 		aFlags.bSetNumRule = sal_False;
2209cdf0e10cSrcweir 
2210cdf0e10cSrcweir 	sal_Bool bReplaceStyles = !aFlags.bAFmtByInput || aFlags.bReplaceStyles;
2211cdf0e10cSrcweir 
2212cdf0e10cSrcweir     const SwTxtNode* pNxtNd = 0;
2213cdf0e10cSrcweir     sal_Bool bNxtEmpty = sal_False;
2214cdf0e10cSrcweir     sal_Bool bNxtAlpha = sal_False;
2215cdf0e10cSrcweir     sal_uInt16 nNxtLevel = 0;
2216cdf0e10cSrcweir 
2217cdf0e10cSrcweir 	// setze den Bereich zum Autoformatieren
2218cdf0e10cSrcweir 	if( pSttNd )
2219cdf0e10cSrcweir 	{
2220cdf0e10cSrcweir 		aNdIdx = *pSttNd;
2221cdf0e10cSrcweir 		aNdIdx--;			// fuer GoNextPara, ein Absatz davor
2222cdf0e10cSrcweir 		aEndNdIdx = *pEndNd;
2223cdf0e10cSrcweir 		aEndNdIdx++;
2224cdf0e10cSrcweir 
2225cdf0e10cSrcweir 		// teste den vorhergehenden TextNode
2226cdf0e10cSrcweir 		pNxtNd = aNdIdx.GetNode().GetTxtNode();
2227cdf0e10cSrcweir 		bEmptyLine = !pNxtNd ||
2228cdf0e10cSrcweir 					IsEmptyLine( *pNxtNd ) ||
2229cdf0e10cSrcweir 					IsNoAlphaLine( *pNxtNd );
2230cdf0e10cSrcweir 	}
2231cdf0e10cSrcweir 	else
2232cdf0e10cSrcweir 		bEmptyLine = sal_True;		// am Dokument Anfang
2233cdf0e10cSrcweir 
2234cdf0e10cSrcweir 	bEnde = sal_False;
2235cdf0e10cSrcweir 
2236cdf0e10cSrcweir 	// setze die Werte fuer die Prozent-Anzeige
2237cdf0e10cSrcweir 	nEndNdIdx = aEndNdIdx.GetIndex();
2238cdf0e10cSrcweir 
2239cdf0e10cSrcweir 	if( !aFlags.bAFmtByInput )
2240cdf0e10cSrcweir 		::StartProgress( STR_STATSTR_AUTOFORMAT, aNdIdx.GetIndex(),
2241cdf0e10cSrcweir 						 nEndNdIdx = aEndNdIdx.GetIndex(),
2242cdf0e10cSrcweir 						 pDoc->GetDocShell() );
2243cdf0e10cSrcweir 
2244cdf0e10cSrcweir 	RedlineMode_t eRedlMode = pDoc->GetRedlineMode(), eOldMode = eRedlMode;
2245cdf0e10cSrcweir 	if( aFlags.bWithRedlining )
2246cdf0e10cSrcweir 	{
2247cdf0e10cSrcweir 		pDoc->SetAutoFmtRedline( sal_True );
2248cdf0e10cSrcweir 		eRedlMode = (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT);
2249cdf0e10cSrcweir 	}
2250cdf0e10cSrcweir 	else
2251cdf0e10cSrcweir 	  eRedlMode = (RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_IGNORE);
2252cdf0e10cSrcweir 	pDoc->SetRedlineMode( eRedlMode );
2253cdf0e10cSrcweir 
2254cdf0e10cSrcweir     // save undo state (might be turned off)
2255cdf0e10cSrcweir     bool const bUndoState = pDoc->GetIDocumentUndoRedo().DoesUndo();
2256cdf0e10cSrcweir 
2257cdf0e10cSrcweir 	// wenn mehrere Zeilen, dann erstmal nicht mit
2258cdf0e10cSrcweir 	// dem nachfolgenden Absatz zusammenfassen.
2259cdf0e10cSrcweir 	bMoreLines = sal_False;
2260cdf0e10cSrcweir 
2261cdf0e10cSrcweir 	nLastCalcHeadLvl = nLastCalcEnumLvl = 0;
2262cdf0e10cSrcweir 	nLastHeadLvl = nLastEnumLvl = USHRT_MAX;
2263cdf0e10cSrcweir     sal_uInt16 nLevel = 0;
2264cdf0e10cSrcweir     sal_uInt16 nDigitLvl = 0;
2265cdf0e10cSrcweir 
2266cdf0e10cSrcweir 	// defaulten
2267cdf0e10cSrcweir 	SwTxtFrmInfo aFInfo( 0 );
2268cdf0e10cSrcweir 
2269cdf0e10cSrcweir 	// das ist unser Automat fuer die Auto-Formatierung
2270cdf0e10cSrcweir 	eStat = READ_NEXT_PARA;
2271cdf0e10cSrcweir 	while( !bEnde )
2272cdf0e10cSrcweir 	{
2273cdf0e10cSrcweir 		switch( eStat )
2274cdf0e10cSrcweir 		{
2275cdf0e10cSrcweir 		case READ_NEXT_PARA:
2276cdf0e10cSrcweir 			{
2277cdf0e10cSrcweir 				GoNextPara();
2278cdf0e10cSrcweir 				eStat = bEnde ? IS_ENDE : TST_EMPTY_LINE;
2279cdf0e10cSrcweir 			}
2280cdf0e10cSrcweir 			break;
2281cdf0e10cSrcweir 
2282cdf0e10cSrcweir 		case TST_EMPTY_LINE:
2283cdf0e10cSrcweir 			if( IsEmptyLine( *pAktTxtNd ) )
2284cdf0e10cSrcweir 			{
2285cdf0e10cSrcweir 				if( aFlags.bDelEmptyNode && !HasObjects( *pAktTxtNd ) )
2286cdf0e10cSrcweir 				{
2287cdf0e10cSrcweir 					bEmptyLine = sal_True;
2288cdf0e10cSrcweir 					sal_uLong nOldCnt = pDoc->GetNodes().Count();
2289cdf0e10cSrcweir 					DelEmptyLine();
2290cdf0e10cSrcweir 					// wurde wiklich ein Node geloescht ?
2291cdf0e10cSrcweir 					if( nOldCnt != pDoc->GetNodes().Count() )
2292cdf0e10cSrcweir 						aNdIdx--;		// nicht den naechsten Absatz ueberspringen
2293cdf0e10cSrcweir 				}
2294cdf0e10cSrcweir 				eStat = READ_NEXT_PARA;
2295cdf0e10cSrcweir 			}
2296cdf0e10cSrcweir 			else
2297cdf0e10cSrcweir 				eStat = TST_ALPHA_LINE;
2298cdf0e10cSrcweir 			break;
2299cdf0e10cSrcweir 
2300cdf0e10cSrcweir 		case TST_ALPHA_LINE:
2301cdf0e10cSrcweir 			if( IsNoAlphaLine( *pAktTxtNd ))
2302cdf0e10cSrcweir 			{
2303cdf0e10cSrcweir 				// erkenne eine Tabellendefinition +---+---+
2304cdf0e10cSrcweir 				if( aFlags.bAFmtByInput && aFlags.bCreateTable && DoTable() )
2305cdf0e10cSrcweir 				{
2306cdf0e10cSrcweir 					//JP 30.09.96: das DoTable() verlaesst sich auf das
2307cdf0e10cSrcweir 					//				Pop und Move - Crsr nach dem AutoFormat!
2308cdf0e10cSrcweir 					pEdShell->Pop( sal_False );
2309cdf0e10cSrcweir 					*pEdShell->GetCrsr() = aDelPam;
2310cdf0e10cSrcweir 					pEdShell->Push();
2311cdf0e10cSrcweir 
2312cdf0e10cSrcweir 					eStat = IS_ENDE;
2313cdf0e10cSrcweir 					break;
2314cdf0e10cSrcweir 				}
2315cdf0e10cSrcweir 
2316cdf0e10cSrcweir 				// dann teste mal auf 3 "---" oder "===". In dem Fall
2317cdf0e10cSrcweir 				// soll der vorherige Absatz unterstrichen und dieser
2318cdf0e10cSrcweir 				// geloescht werden!
2319cdf0e10cSrcweir 				if( !DoUnderline() && bReplaceStyles )
2320cdf0e10cSrcweir 				{
2321cdf0e10cSrcweir 					SetColl( RES_POOLCOLL_STANDARD, sal_True );
2322cdf0e10cSrcweir 					bEmptyLine = sal_True;
2323cdf0e10cSrcweir 				}
2324cdf0e10cSrcweir 				eStat = READ_NEXT_PARA;
2325cdf0e10cSrcweir 			}
2326cdf0e10cSrcweir 			else
2327cdf0e10cSrcweir 				eStat = GET_ALL_INFO;
2328cdf0e10cSrcweir 			break;
2329cdf0e10cSrcweir 
2330cdf0e10cSrcweir 		case GET_ALL_INFO:
2331cdf0e10cSrcweir 			{
2332cdf0e10cSrcweir 				if( pAktTxtNd->GetNumRule() )
2333cdf0e10cSrcweir 				{
2334cdf0e10cSrcweir 					// in Numerierung nichts machen, zum naechsten
2335cdf0e10cSrcweir 					bEmptyLine = sal_False;
2336cdf0e10cSrcweir 					eStat = READ_NEXT_PARA;
2337cdf0e10cSrcweir 					// loesche alle Blanks am Anfang/Ende
2338cdf0e10cSrcweir 					// und alle mitten drin
2339cdf0e10cSrcweir 					//JP 29.04.98: erstmal nur alle "mitten drin".
2340cdf0e10cSrcweir 					DelMoreLinesBlanks( sal_False );
2341cdf0e10cSrcweir 					break;
2342cdf0e10cSrcweir 				}
2343cdf0e10cSrcweir 
2344cdf0e10cSrcweir 				aFInfo.SetFrm( pAktTxtFrm );
2345cdf0e10cSrcweir 
2346cdf0e10cSrcweir 				// erstmal: wurden schon mal entsprechende Vorlagen
2347cdf0e10cSrcweir 				//			vergeben, so behalte die bei, gehe zum
2348cdf0e10cSrcweir 				//			naechsten Node.
2349cdf0e10cSrcweir 				sal_uInt16 nPoolId = pAktTxtNd->GetTxtColl()->GetPoolFmtId();
2350cdf0e10cSrcweir 				if( IsPoolUserFmt( nPoolId )
2351cdf0e10cSrcweir 						? !aFlags.bChgUserColl
2352cdf0e10cSrcweir 						: ( RES_POOLCOLL_STANDARD != nPoolId &&
2353cdf0e10cSrcweir 						   ( !aFlags.bAFmtByInput ||
2354cdf0e10cSrcweir 							(RES_POOLCOLL_TEXT_MOVE != nPoolId &&
2355cdf0e10cSrcweir 							 RES_POOLCOLL_TEXT != nPoolId )) ))
2356cdf0e10cSrcweir 				{
2357cdf0e10cSrcweir 					eStat = HAS_FMTCOLL;
2358cdf0e10cSrcweir 					break;
2359cdf0e10cSrcweir 				}
2360cdf0e10cSrcweir 
2361cdf0e10cSrcweir 				// teste auf Harte oder aus Vorlagen gesetzte LRSpaces
2362cdf0e10cSrcweir 				if( IsPoolUserFmt( nPoolId ) ||
2363cdf0e10cSrcweir 					RES_POOLCOLL_STANDARD == nPoolId )
2364cdf0e10cSrcweir 				{
2365cdf0e10cSrcweir 					short nSz;
2366cdf0e10cSrcweir 					SvxLRSpaceItem* pLRSpace;
2367cdf0e10cSrcweir 					if( SFX_ITEM_SET == pAktTxtNd->GetSwAttrSet().
2368cdf0e10cSrcweir 						GetItemState( RES_LR_SPACE, sal_True,
2369cdf0e10cSrcweir 										(const SfxPoolItem**)&pLRSpace ) &&
2370cdf0e10cSrcweir 						( 0 != (nSz = pLRSpace->GetTxtFirstLineOfst()) ||
2371cdf0e10cSrcweir 							0 != pLRSpace->GetTxtLeft() ) )
2372cdf0e10cSrcweir 					{
2373cdf0e10cSrcweir 						// Ausnahme: Numerierun/Aufzaehlung kann mit Einzug
2374cdf0e10cSrcweir 						//		existieren!!
2375cdf0e10cSrcweir 						if( IsEnumericChar( *pAktTxtNd ))
2376cdf0e10cSrcweir 						{
2377cdf0e10cSrcweir 							nLevel = CalcLevel( *pAktTxtNd, &nDigitLvl );
2378cdf0e10cSrcweir 							if( nLevel >= MAXLEVEL )
2379cdf0e10cSrcweir 								nLevel = MAXLEVEL-1;
2380cdf0e10cSrcweir 							BuildEnum( nLevel, nDigitLvl );
2381cdf0e10cSrcweir 							eStat = READ_NEXT_PARA;
2382cdf0e10cSrcweir 							break;
2383cdf0e10cSrcweir 						}
2384cdf0e10cSrcweir 
2385cdf0e10cSrcweir 
2386cdf0e10cSrcweir 						// nie zusammenfassen, so belassen
2387cdf0e10cSrcweir 						// (Opt. vielleicht als Ausnahmen nur Einzug)
2388cdf0e10cSrcweir 						bMoreLines = sal_True;
2389cdf0e10cSrcweir 
2390cdf0e10cSrcweir 						if( bReplaceStyles )
2391cdf0e10cSrcweir 						{
2392cdf0e10cSrcweir 							// dann setze doch eine unserer Vorlagen
2393cdf0e10cSrcweir 							if( 0 < nSz )			// positiver 1. Zeileneinzug
2394cdf0e10cSrcweir 								BuildIndent();
2395cdf0e10cSrcweir 							else if( 0 > nSz )		// negativer 1. Zeileneinzug
2396cdf0e10cSrcweir 								BuildNegIndent( aFInfo.GetLineStart() );
2397cdf0e10cSrcweir 							else if( pLRSpace->GetTxtLeft() )	// ist ein Einzug
2398cdf0e10cSrcweir 								BuildTextIndent();
2399cdf0e10cSrcweir 						}
2400cdf0e10cSrcweir 						eStat = READ_NEXT_PARA;
2401cdf0e10cSrcweir 						break;
2402cdf0e10cSrcweir 					}
2403cdf0e10cSrcweir 				}
2404cdf0e10cSrcweir 
2405cdf0e10cSrcweir 				nLevel = CalcLevel( *pAktTxtNd, &nDigitLvl );
2406cdf0e10cSrcweir 				bMoreLines = !IsOneLine( *pAktTxtNd );
2407cdf0e10cSrcweir 				pNxtNd = GetNextNode();
2408cdf0e10cSrcweir 				if( pNxtNd )
2409cdf0e10cSrcweir 				{
2410cdf0e10cSrcweir 					bNxtEmpty = IsEmptyLine( *pNxtNd );
2411cdf0e10cSrcweir 					bNxtAlpha = IsNoAlphaLine( *pNxtNd );
2412cdf0e10cSrcweir 					nNxtLevel = CalcLevel( *pNxtNd );
2413cdf0e10cSrcweir 
2414cdf0e10cSrcweir 					if( !bEmptyLine && HasBreakAttr( *pAktTxtNd ) )
2415cdf0e10cSrcweir 						bEmptyLine = sal_True;
2416cdf0e10cSrcweir 					if( !bNxtEmpty && HasBreakAttr( *pNxtNd ) )
2417cdf0e10cSrcweir 						bNxtEmpty = sal_True;
2418cdf0e10cSrcweir 
2419cdf0e10cSrcweir 					// fuer z.B. selbst definierte Einzuege oder
2420cdf0e10cSrcweir 					// rechts/zentierte Ausrichtung
2421cdf0e10cSrcweir //					if( !nLevel && 0 != aFInfo.GetLineStart() )
2422cdf0e10cSrcweir //						nLevel = 1;
2423cdf0e10cSrcweir 				}
2424cdf0e10cSrcweir 				else
2425cdf0e10cSrcweir 				{
2426cdf0e10cSrcweir 					bNxtEmpty = sal_False; // sal_True;
2427cdf0e10cSrcweir 					bNxtAlpha = sal_False;
2428cdf0e10cSrcweir 					nNxtLevel = 0;
2429cdf0e10cSrcweir 				}
2430cdf0e10cSrcweir 				eStat = !bMoreLines ? IS_ONE_LINE : TST_ENUMERIC;
2431cdf0e10cSrcweir 			}
2432cdf0e10cSrcweir 			break;
2433cdf0e10cSrcweir 
2434cdf0e10cSrcweir 		case IS_ONE_LINE:
2435cdf0e10cSrcweir 			{
2436cdf0e10cSrcweir 				eStat = TST_ENUMERIC;
2437cdf0e10cSrcweir 				if( !bReplaceStyles )
2438cdf0e10cSrcweir 					break;
2439cdf0e10cSrcweir 
2440cdf0e10cSrcweir 				String sClrStr( pAktTxtNd->GetTxt() );
2441cdf0e10cSrcweir 
2442cdf0e10cSrcweir 				if( !DelLeadingBlanks( sClrStr ).Len() )
2443cdf0e10cSrcweir 				{
2444cdf0e10cSrcweir 					bEmptyLine = sal_True;
2445cdf0e10cSrcweir 					eStat = READ_NEXT_PARA;
2446cdf0e10cSrcweir 					break;		// naechsten Absatz lesen
2447cdf0e10cSrcweir 				}
2448cdf0e10cSrcweir 
2449cdf0e10cSrcweir 				// Teste auf Ueberschrift
2450cdf0e10cSrcweir 				if( !bEmptyLine || !IsFirstCharCapital( *pAktTxtNd ) ||
2451cdf0e10cSrcweir 					IsBlanksInString( *pAktTxtNd ) )
2452cdf0e10cSrcweir 					break;
2453cdf0e10cSrcweir 
2454cdf0e10cSrcweir 				bEmptyLine = sal_False;
2455cdf0e10cSrcweir 				String sEndClrStr( sClrStr );
2456cdf0e10cSrcweir 				xub_StrLen nLen = DelTrailingBlanks( sEndClrStr ).Len();
2457cdf0e10cSrcweir 
2458cdf0e10cSrcweir 				// nicht, dann teste auf Ueberschrift
2459cdf0e10cSrcweir 				if( ':' == sEndClrStr.GetChar( nLen - 1 ) )
2460cdf0e10cSrcweir 				{
2461cdf0e10cSrcweir //---------------------------------------------------------------------------
2462cdf0e10cSrcweir // Wie ist denn nun die Bedingung fuer die Ueberschrift auf Ebene 3 ??
2463cdf0e10cSrcweir // Zur Zeit: generell wenn am Ende ein ':' ist.
2464cdf0e10cSrcweir //
2465cdf0e10cSrcweir //					if( bNxtEmpty || bNxtAlpha )
2466cdf0e10cSrcweir //						!IsEnumericChar( *pNxtNd ) )
2467cdf0e10cSrcweir //---------------------------------------------------------------------------
2468cdf0e10cSrcweir 					{
2469cdf0e10cSrcweir 						BuildHeadLine( 2 );
2470cdf0e10cSrcweir 						eStat = READ_NEXT_PARA;
2471cdf0e10cSrcweir 						break;
2472cdf0e10cSrcweir 					}
2473cdf0e10cSrcweir 				}
2474cdf0e10cSrcweir 				else if( 256 <= sEndClrStr.GetChar( nLen-1 ) ||
2475cdf0e10cSrcweir 						 !strchr( ",.;", sEndClrStr.GetChar( nLen-1 )) )
2476cdf0e10cSrcweir 				{
2477cdf0e10cSrcweir 					if( bNxtEmpty || bNxtAlpha
2478cdf0e10cSrcweir 						|| ( pNxtNd && IsEnumericChar( *pNxtNd ))
2479cdf0e10cSrcweir 
2480cdf0e10cSrcweir //---------------------------------------------------------------------------
2481cdf0e10cSrcweir // ist zum Verwechseln mit neg. Einzug !!
2482cdf0e10cSrcweir 						/*|| nLevel < nNxtLevel*/
2483cdf0e10cSrcweir //---------------------------------------------------------------------------
2484cdf0e10cSrcweir 
2485cdf0e10cSrcweir 						)
2486cdf0e10cSrcweir 					{
2487cdf0e10cSrcweir 						// wurde Level vom Text vorgegeben ?
2488cdf0e10cSrcweir //						if( USHRT_MAX != nDigitLvl )
2489cdf0e10cSrcweir //							nLevel = nDigitLvl;
2490cdf0e10cSrcweir 
2491cdf0e10cSrcweir 						// eine Ebene runter ?
2492cdf0e10cSrcweir 						if( nLevel >= MAXLEVEL )
2493cdf0e10cSrcweir 							nLevel = MAXLEVEL-1;
2494cdf0e10cSrcweir 
2495cdf0e10cSrcweir 						if( USHRT_MAX == nLastHeadLvl )
2496cdf0e10cSrcweir 							nLastHeadLvl = 0;
2497cdf0e10cSrcweir 						else if( nLastCalcHeadLvl < nLevel )
2498cdf0e10cSrcweir 						{
2499cdf0e10cSrcweir 							if( nLastHeadLvl+1 < MAXLEVEL )
2500cdf0e10cSrcweir 								++nLastHeadLvl;
2501cdf0e10cSrcweir 						}
2502cdf0e10cSrcweir 						// eine Ebene hoch ?
2503cdf0e10cSrcweir 						else if( nLastCalcHeadLvl > nLevel )
2504cdf0e10cSrcweir 						{
2505cdf0e10cSrcweir 							if( nLastHeadLvl )
2506cdf0e10cSrcweir 								--nLastHeadLvl;
2507cdf0e10cSrcweir 						}
2508cdf0e10cSrcweir 						nLastCalcHeadLvl = nLevel;
2509cdf0e10cSrcweir 
2510cdf0e10cSrcweir 						if( aFlags.bAFmtByInput )
2511cdf0e10cSrcweir 							BuildHeadLine( nLevel );
2512cdf0e10cSrcweir 						else
2513cdf0e10cSrcweir 							BuildHeadLine( nLastHeadLvl );
2514cdf0e10cSrcweir 						eStat = READ_NEXT_PARA;
2515cdf0e10cSrcweir 						break;
2516cdf0e10cSrcweir 					}
2517cdf0e10cSrcweir 				}
2518cdf0e10cSrcweir 			}
2519cdf0e10cSrcweir 			break;
2520cdf0e10cSrcweir 
2521cdf0e10cSrcweir 		case TST_ENUMERIC:
2522cdf0e10cSrcweir 			{
2523cdf0e10cSrcweir 				bEmptyLine = sal_False;
2524cdf0e10cSrcweir 				if( IsEnumericChar( *pAktTxtNd ))
2525cdf0e10cSrcweir 				{
2526cdf0e10cSrcweir 					if( nLevel >= MAXLEVEL )
2527cdf0e10cSrcweir 						nLevel = MAXLEVEL-1;
2528cdf0e10cSrcweir 					BuildEnum( nLevel, nDigitLvl );
2529cdf0e10cSrcweir 					eStat = READ_NEXT_PARA;
2530cdf0e10cSrcweir 				}
2531cdf0e10cSrcweir //JP 25.03.96: Vorlagen fuer Einzug zulassen
2532cdf0e10cSrcweir //				else if( aFlags.bAFmtByInput )
2533cdf0e10cSrcweir //					eStat = READ_NEXT_PARA;
2534cdf0e10cSrcweir 				else if( bReplaceStyles )
2535cdf0e10cSrcweir 					eStat = nLevel ? TST_IDENT : TST_NEG_IDENT;
2536cdf0e10cSrcweir 				else
2537cdf0e10cSrcweir 					eStat = READ_NEXT_PARA;
2538cdf0e10cSrcweir 			}
2539cdf0e10cSrcweir 			break;
2540cdf0e10cSrcweir 
2541cdf0e10cSrcweir 		case TST_IDENT:
2542cdf0e10cSrcweir 			// Spaces am Anfang, dann teste doch mal auf Einzuege
2543cdf0e10cSrcweir 			if( bMoreLines && nLevel )
2544cdf0e10cSrcweir 			{
2545cdf0e10cSrcweir 				SwTwips nSz = aFInfo.GetFirstIndent();
2546cdf0e10cSrcweir 				if( 0 < nSz )			// positiver 1. Zeileneinzug
2547cdf0e10cSrcweir 					BuildIndent();
2548cdf0e10cSrcweir 				else if( 0 > nSz )		// negativer 1. Zeileneinzug
2549cdf0e10cSrcweir 					BuildNegIndent( aFInfo.GetLineStart() );
2550cdf0e10cSrcweir 				else					// ist ein Einzug
2551cdf0e10cSrcweir 					BuildTextIndent();
2552cdf0e10cSrcweir 				eStat = READ_NEXT_PARA;
2553cdf0e10cSrcweir 			}
2554cdf0e10cSrcweir 			else if( nLevel && pNxtNd && !bEnde &&
2555cdf0e10cSrcweir 					 !bNxtEmpty && !bNxtAlpha && !nNxtLevel &&
2556cdf0e10cSrcweir 					 !IsEnumericChar( *pNxtNd ) )
2557cdf0e10cSrcweir 			{
2558cdf0e10cSrcweir 				// ist ein Einzug
2559cdf0e10cSrcweir 				BuildIndent();
2560cdf0e10cSrcweir 				eStat = READ_NEXT_PARA;
2561cdf0e10cSrcweir 			}
2562cdf0e10cSrcweir 			else
2563cdf0e10cSrcweir 				eStat = TST_TXT_BODY;
2564cdf0e10cSrcweir 			break;
2565cdf0e10cSrcweir 
2566cdf0e10cSrcweir 		case TST_NEG_IDENT:
2567cdf0e10cSrcweir 			// keine Spaces am Anfang, dann teste doch mal auf neg. Einzuege
2568cdf0e10cSrcweir 			{
2569cdf0e10cSrcweir 				if( bMoreLines && !nLevel )
2570cdf0e10cSrcweir 				{
2571cdf0e10cSrcweir 					SwTwips nSz = aFInfo.GetFirstIndent();
2572cdf0e10cSrcweir 					if( 0 < nSz )			// positiver 1. Zeileneinzug
2573cdf0e10cSrcweir 						BuildIndent();
2574cdf0e10cSrcweir 					else if( 0 > nSz )		// negativer 1. Zeileneinzug
2575cdf0e10cSrcweir 						BuildNegIndent( aFInfo.GetLineStart() );
2576cdf0e10cSrcweir 					else					// ist ein kein Einzug
2577cdf0e10cSrcweir 						BuildText();
2578cdf0e10cSrcweir 					eStat = READ_NEXT_PARA;
2579cdf0e10cSrcweir 				}
2580cdf0e10cSrcweir 				else if( !nLevel && pNxtNd && !bEnde &&
2581cdf0e10cSrcweir 						 !bNxtEmpty && !bNxtAlpha && nNxtLevel &&
2582cdf0e10cSrcweir 						 !IsEnumericChar( *pNxtNd ) )
2583cdf0e10cSrcweir 				{
2584cdf0e10cSrcweir 					// ist ein neg. Einzug
2585cdf0e10cSrcweir 					BuildNegIndent( aFInfo.GetLineStart() );
2586cdf0e10cSrcweir 					eStat = READ_NEXT_PARA;
2587cdf0e10cSrcweir 				}
2588cdf0e10cSrcweir 				else
2589cdf0e10cSrcweir 					eStat = TST_TXT_BODY;
2590cdf0e10cSrcweir 			}
2591cdf0e10cSrcweir 			break;
2592cdf0e10cSrcweir 
2593cdf0e10cSrcweir 		case TST_TXT_BODY:
2594cdf0e10cSrcweir 			{
2595cdf0e10cSrcweir 				if( bMoreLines )
2596cdf0e10cSrcweir 				{
2597cdf0e10cSrcweir 					SwTwips nSz = aFInfo.GetFirstIndent();
2598cdf0e10cSrcweir 					if( 0 < nSz )			// positiver 1. Zeileneinzug
2599cdf0e10cSrcweir 						BuildIndent();
2600cdf0e10cSrcweir 					else if( 0 > nSz )		// negativer 1. Zeileneinzug
2601cdf0e10cSrcweir 						BuildNegIndent( aFInfo.GetLineStart() );
2602cdf0e10cSrcweir 					else if( nLevel )		// ist ein Einzug
2603cdf0e10cSrcweir 						BuildTextIndent();
2604cdf0e10cSrcweir 					else
2605cdf0e10cSrcweir 						BuildText();
2606cdf0e10cSrcweir 				}
2607cdf0e10cSrcweir 				else if( nLevel )
2608cdf0e10cSrcweir 					BuildTextIndent();
2609cdf0e10cSrcweir 				else
2610cdf0e10cSrcweir 					BuildText();
2611cdf0e10cSrcweir 				eStat = READ_NEXT_PARA;
2612cdf0e10cSrcweir 			}
2613cdf0e10cSrcweir 			break;
2614cdf0e10cSrcweir 
2615cdf0e10cSrcweir 		case HAS_FMTCOLL:
2616cdf0e10cSrcweir 			{
2617cdf0e10cSrcweir 				// erstmal: wurden schon mal entsprechende Vorlagen
2618cdf0e10cSrcweir 				//			vergeben, so behalte die bei, gehe zum
2619cdf0e10cSrcweir 				//			naechsten Node.
2620cdf0e10cSrcweir 				bEmptyLine = sal_False;
2621cdf0e10cSrcweir 				eStat = READ_NEXT_PARA;
2622cdf0e10cSrcweir 				// loesche alle Blanks am Anfang/Ende
2623cdf0e10cSrcweir 				// und alle mitten drin
2624cdf0e10cSrcweir 				//JP 29.04.98: erstmal nur alle "mitten drin".
2625cdf0e10cSrcweir 				DelMoreLinesBlanks( sal_False );
2626cdf0e10cSrcweir 
2627cdf0e10cSrcweir 				// behandel die harte Attributierung
2628cdf0e10cSrcweir                 if( pAktTxtNd->HasSwAttrSet() )
2629cdf0e10cSrcweir 				{
2630cdf0e10cSrcweir 					short nSz;
2631cdf0e10cSrcweir 					SvxLRSpaceItem* pLRSpace;
2632cdf0e10cSrcweir 					if( bReplaceStyles &&
2633cdf0e10cSrcweir                         SFX_ITEM_SET == pAktTxtNd->GetSwAttrSet().
2634cdf0e10cSrcweir 						GetItemState( RES_LR_SPACE, sal_False,
2635cdf0e10cSrcweir 										(const SfxPoolItem**)&pLRSpace ) &&
2636cdf0e10cSrcweir 						( 0 != (nSz = pLRSpace->GetTxtFirstLineOfst()) ||
2637cdf0e10cSrcweir 							0 != pLRSpace->GetTxtLeft() ) )
2638cdf0e10cSrcweir 					{
2639cdf0e10cSrcweir 						// dann setze doch eine unserer Vorlagen
2640cdf0e10cSrcweir 						if( 0 < nSz )			// positiver 1. Zeileneinzug
2641cdf0e10cSrcweir 							BuildIndent();
2642cdf0e10cSrcweir 						else if( 0 > nSz )		// negativer 1. Zeileneinzug
2643cdf0e10cSrcweir 						{
2644cdf0e10cSrcweir 							BuildNegIndent( aFInfo.GetLineStart() );
2645cdf0e10cSrcweir 						}
2646cdf0e10cSrcweir 						else if( pLRSpace->GetTxtLeft() )	// ist ein Einzug
2647cdf0e10cSrcweir 							BuildTextIndent();
2648cdf0e10cSrcweir 						else
2649cdf0e10cSrcweir 							BuildText();
2650cdf0e10cSrcweir 					}
2651cdf0e10cSrcweir 				}
2652cdf0e10cSrcweir 			}
2653cdf0e10cSrcweir 			break;
2654cdf0e10cSrcweir 
2655cdf0e10cSrcweir 		case IS_ENDE:
2656cdf0e10cSrcweir 			bEnde = sal_True;
2657cdf0e10cSrcweir 			break;
2658cdf0e10cSrcweir 		}
2659cdf0e10cSrcweir 	}
2660cdf0e10cSrcweir 
2661cdf0e10cSrcweir 	if( aFlags.bWithRedlining )
2662cdf0e10cSrcweir 		pDoc->SetAutoFmtRedline( sal_False );
2663cdf0e10cSrcweir 	pDoc->SetRedlineMode( eOldMode );
2664cdf0e10cSrcweir 
2665cdf0e10cSrcweir     // restore undo (in case it has been changed)
2666cdf0e10cSrcweir     pDoc->GetIDocumentUndoRedo().DoUndo(bUndoState);
2667cdf0e10cSrcweir 
2668cdf0e10cSrcweir 	// Prozent-Anzeige wieder abschalten
2669cdf0e10cSrcweir 	if( !aFlags.bAFmtByInput )
2670cdf0e10cSrcweir 		::EndProgress( pDoc->GetDocShell() );
2671cdf0e10cSrcweir }
2672cdf0e10cSrcweir 
AutoFormat(const SvxSwAutoFmtFlags * pAFlags)2673cdf0e10cSrcweir void SwEditShell::AutoFormat( const SvxSwAutoFmtFlags* pAFlags )
2674cdf0e10cSrcweir {
2675cdf0e10cSrcweir 	SwWait* pWait = 0;
2676cdf0e10cSrcweir 
2677cdf0e10cSrcweir 	SET_CURR_SHELL( this );
2678cdf0e10cSrcweir 	StartAllAction();
2679cdf0e10cSrcweir 	StartUndo( UNDO_AUTOFORMAT );
2680cdf0e10cSrcweir 
2681cdf0e10cSrcweir 	SvxSwAutoFmtFlags aAFFlags;		// erst mal default - Werte
2682cdf0e10cSrcweir 	if( pAFlags )					// oder doch angegeben ??
2683cdf0e10cSrcweir 	{
2684cdf0e10cSrcweir 		aAFFlags = *pAFlags;
2685cdf0e10cSrcweir 		if( !aAFFlags.bAFmtByInput )
2686*8ef2f12bSOliver-Rainer Wittmann 			pWait = new SwWait( *GetDoc()->GetDocShell(), true );
2687cdf0e10cSrcweir 	}
2688cdf0e10cSrcweir 
2689cdf0e10cSrcweir 	SwPaM* pCrsr = GetCrsr();
2690cdf0e10cSrcweir 	// es gibt mehr als einen oder ist eine Selektion offen
2691cdf0e10cSrcweir 	if( pCrsr->GetNext() != pCrsr || pCrsr->HasMark() )
2692cdf0e10cSrcweir 	{
2693cdf0e10cSrcweir 		FOREACHPAM_START(this)
2694cdf0e10cSrcweir 			if( PCURCRSR->HasMark() )
2695cdf0e10cSrcweir 			{
2696cdf0e10cSrcweir 				SwAutoFormat aFmt( this, aAFFlags, &PCURCRSR->Start()->nNode,
2697cdf0e10cSrcweir 									 &PCURCRSR->End()->nNode );
2698cdf0e10cSrcweir 			}
2699cdf0e10cSrcweir 		FOREACHPAM_END()
2700cdf0e10cSrcweir 	}
2701cdf0e10cSrcweir 	else
2702cdf0e10cSrcweir 	{
2703cdf0e10cSrcweir 		SwAutoFormat aFmt( this, aAFFlags );
2704cdf0e10cSrcweir 	}
2705cdf0e10cSrcweir 
2706cdf0e10cSrcweir 	EndUndo( UNDO_AUTOFORMAT );
2707cdf0e10cSrcweir 	EndAllAction();
2708cdf0e10cSrcweir 
2709cdf0e10cSrcweir 	delete pWait;
2710cdf0e10cSrcweir }
2711cdf0e10cSrcweir 
2712cdf0e10cSrcweir 
AutoFmtBySplitNode()2713cdf0e10cSrcweir void SwEditShell::AutoFmtBySplitNode()
2714cdf0e10cSrcweir {
2715cdf0e10cSrcweir 	SET_CURR_SHELL( this );
2716cdf0e10cSrcweir 	SwPaM* pCrsr = GetCrsr();
2717cdf0e10cSrcweir 	if( pCrsr->GetNext() == pCrsr && pCrsr->Move( fnMoveBackward, fnGoNode ) )
2718cdf0e10cSrcweir 	{
2719cdf0e10cSrcweir 		StartAllAction();
2720cdf0e10cSrcweir 		StartUndo( UNDO_AUTOFORMAT );
2721cdf0e10cSrcweir 
2722cdf0e10cSrcweir 		sal_Bool bRange = sal_False;
2723cdf0e10cSrcweir 		pCrsr->SetMark();
2724cdf0e10cSrcweir 		SwIndex* pCntnt = &pCrsr->GetMark()->nContent;
2725cdf0e10cSrcweir 		if( pCntnt->GetIndex() )
2726cdf0e10cSrcweir 		{
2727cdf0e10cSrcweir 			*pCntnt = 0;
2728cdf0e10cSrcweir 			bRange = sal_True;
2729cdf0e10cSrcweir 		}
2730cdf0e10cSrcweir 		else
2731cdf0e10cSrcweir 		{
2732cdf0e10cSrcweir 			// dann einen Node zurueckspringen
2733cdf0e10cSrcweir 			SwNodeIndex aNdIdx( pCrsr->GetMark()->nNode, -1 );
2734cdf0e10cSrcweir 			SwTxtNode* pTxtNd = aNdIdx.GetNode().GetTxtNode();
2735cdf0e10cSrcweir 			if( pTxtNd && pTxtNd->GetTxt().Len() )
2736cdf0e10cSrcweir 			{
2737cdf0e10cSrcweir 				pCntnt->Assign( pTxtNd, 0 );
2738cdf0e10cSrcweir 				pCrsr->GetMark()->nNode = aNdIdx;
2739cdf0e10cSrcweir 				bRange = sal_True;
2740cdf0e10cSrcweir 			}
2741cdf0e10cSrcweir 		}
2742cdf0e10cSrcweir 
2743cdf0e10cSrcweir 		if( bRange )
2744cdf0e10cSrcweir 		{
2745cdf0e10cSrcweir 			Push();		// Cursor sichern
2746cdf0e10cSrcweir 
2747cdf0e10cSrcweir 			SvxSwAutoFmtFlags aAFFlags = *GetAutoFmtFlags();		// erst mal default - Werte
2748cdf0e10cSrcweir 
2749cdf0e10cSrcweir 			SwAutoFormat aFmt( this, aAFFlags, &pCrsr->GetMark()->nNode,
2750cdf0e10cSrcweir 									&pCrsr->GetPoint()->nNode );
2751cdf0e10cSrcweir 
2752cdf0e10cSrcweir 			//JP 30.09.96: das DoTable() verlaesst sich auf das PopCrsr
2753cdf0e10cSrcweir 			//				und MoveCrsr!
2754cdf0e10cSrcweir 			Pop( sal_False );
2755cdf0e10cSrcweir 			pCrsr = GetCrsr();
2756cdf0e10cSrcweir 		}
2757cdf0e10cSrcweir 		pCrsr->DeleteMark();
2758cdf0e10cSrcweir 		pCrsr->Move( fnMoveForward, fnGoNode );
2759cdf0e10cSrcweir 
2760cdf0e10cSrcweir 		EndUndo( UNDO_AUTOFORMAT );
2761cdf0e10cSrcweir 		EndAllAction();
2762cdf0e10cSrcweir 	}
2763cdf0e10cSrcweir }
2764cdf0e10cSrcweir 
GetAutoFmtFlags()2765cdf0e10cSrcweir SvxSwAutoFmtFlags* SwEditShell::GetAutoFmtFlags()
2766cdf0e10cSrcweir {
2767cdf0e10cSrcweir 	if (!pAutoFmtFlags)
2768cdf0e10cSrcweir 		pAutoFmtFlags = new SvxSwAutoFmtFlags;
2769cdf0e10cSrcweir 
2770cdf0e10cSrcweir 	return pAutoFmtFlags;
2771cdf0e10cSrcweir }
2772cdf0e10cSrcweir 
SetAutoFmtFlags(SvxSwAutoFmtFlags * pFlags)2773cdf0e10cSrcweir void SwEditShell::SetAutoFmtFlags(SvxSwAutoFmtFlags * pFlags)
2774cdf0e10cSrcweir {
2775cdf0e10cSrcweir 	SvxSwAutoFmtFlags* pEditFlags = GetAutoFmtFlags();
2776cdf0e10cSrcweir 
2777cdf0e10cSrcweir 	pEditFlags->bSetNumRule		= pFlags->bSetNumRule;
2778cdf0e10cSrcweir 	pEditFlags->bChgEnumNum		= pFlags->bChgEnumNum;
2779cdf0e10cSrcweir 	pEditFlags->bSetBorder		= pFlags->bSetBorder;
2780cdf0e10cSrcweir 	pEditFlags->bCreateTable	= pFlags->bCreateTable;
2781cdf0e10cSrcweir 	pEditFlags->bReplaceStyles	= pFlags->bReplaceStyles;
2782cdf0e10cSrcweir 	pEditFlags->bAFmtByInpDelSpacesAtSttEnd =
2783cdf0e10cSrcweir 									pFlags->bAFmtByInpDelSpacesAtSttEnd;
2784cdf0e10cSrcweir 	pEditFlags->bAFmtByInpDelSpacesBetweenLines =
2785cdf0e10cSrcweir 									pFlags->bAFmtByInpDelSpacesBetweenLines;
2786cdf0e10cSrcweir 
2787cdf0e10cSrcweir 	//JP 15.12.98: BulletZeichen und Font in die "normalen" kopieren,
2788cdf0e10cSrcweir 	//			weil beim Autoformat nur mit diesen gearbeitet wird!
2789cdf0e10cSrcweir 	pEditFlags->cBullet				= pFlags->cByInputBullet;
2790cdf0e10cSrcweir 	pEditFlags->aBulletFont			= pFlags->aByInputBulletFont;
2791cdf0e10cSrcweir 	pEditFlags->cByInputBullet		= pFlags->cByInputBullet;
2792cdf0e10cSrcweir 	pEditFlags->aByInputBulletFont	= pFlags->aByInputBulletFont;
2793cdf0e10cSrcweir }
2794cdf0e10cSrcweir 
2795