xref: /aoo41x/main/sw/source/core/tox/tox.cxx (revision 69a74367)
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
10efeef26fSAndrew Rist  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist  *
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.
19efeef26fSAndrew Rist  *
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 #include <tools/resid.hxx>
28cdf0e10cSrcweir #include <hintids.hxx>
29cdf0e10cSrcweir #include <swtypes.hxx>
30cdf0e10cSrcweir #include <errhdl.hxx>
31cdf0e10cSrcweir #include <txtatr.hxx>
32cdf0e10cSrcweir #include <ndtxt.hxx>
33cdf0e10cSrcweir #include <txttxmrk.hxx>
34cdf0e10cSrcweir #include <tox.hxx>
35cdf0e10cSrcweir #include <poolfmt.hrc>
36cdf0e10cSrcweir #include <doc.hxx>
37cdf0e10cSrcweir #include <docary.hxx>
38cdf0e10cSrcweir #include <paratr.hxx>
39cdf0e10cSrcweir #include <editeng/tstpitem.hxx>
40cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
41cdf0e10cSrcweir #include <hints.hxx> // SwPtrMsgPoolItem
42cdf0e10cSrcweir #include <algorithm>
43cdf0e10cSrcweir #include <functional>
44cdf0e10cSrcweir #include <switerator.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir using namespace std;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir const sal_Char* SwForm::aFormEntry      = "<E>";
49cdf0e10cSrcweir const sal_Char* SwForm::aFormTab        = "<T>";
50cdf0e10cSrcweir const sal_Char* SwForm::aFormPageNums   = "<#>";
51cdf0e10cSrcweir const sal_Char* SwForm::aFormLinkStt    = "<LS>";
52cdf0e10cSrcweir const sal_Char* SwForm::aFormLinkEnd    = "<LE>";
53cdf0e10cSrcweir const sal_Char* SwForm::aFormEntryNum   = "<E#>";
54cdf0e10cSrcweir const sal_Char* SwForm::aFormEntryTxt   = "<ET>";
55cdf0e10cSrcweir const sal_Char* SwForm::aFormChapterMark= "<C>";
56cdf0e10cSrcweir const sal_Char* SwForm::aFormText       = "<X>";
57cdf0e10cSrcweir const sal_Char* SwForm::aFormAuth       = "<A>";
58cdf0e10cSrcweir sal_uInt8 SwForm::nFormTabLen            = 3;
59cdf0e10cSrcweir sal_uInt8 SwForm::nFormEntryLen          = 3;
60cdf0e10cSrcweir sal_uInt8 SwForm::nFormPageNumsLen       = 3;
61cdf0e10cSrcweir sal_uInt8 SwForm::nFormLinkSttLen        = 4;
62cdf0e10cSrcweir sal_uInt8 SwForm::nFormLinkEndLen        = 4;
63cdf0e10cSrcweir sal_uInt8 SwForm::nFormEntryNumLen       = 4;
64cdf0e10cSrcweir sal_uInt8 SwForm::nFormEntryTxtLen       = 4;
65cdf0e10cSrcweir sal_uInt8 SwForm::nFormChapterMarkLen    = 3;
66cdf0e10cSrcweir sal_uInt8 SwForm::nFormTextLen           = 3;
67cdf0e10cSrcweir sal_uInt8 SwForm::nFormAuthLen           = 5;
68cdf0e10cSrcweir 
69cdf0e10cSrcweir SV_IMPL_PTRARR(SwTOXMarks, SwTOXMark*)
70cdf0e10cSrcweir 
71cdf0e10cSrcweir TYPEINIT2( SwTOXMark, SfxPoolItem, SwClient );    // fuers rtti
72cdf0e10cSrcweir 
73cdf0e10cSrcweir struct PatternIni
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     sal_uInt16 n1;
76cdf0e10cSrcweir     sal_uInt16 n2;
77cdf0e10cSrcweir     sal_uInt16 n3;
78cdf0e10cSrcweir     sal_uInt16 n4;
79cdf0e10cSrcweir     sal_uInt16 n5;
80cdf0e10cSrcweir };
81cdf0e10cSrcweir const PatternIni aPatternIni[] =
82cdf0e10cSrcweir {
83cdf0e10cSrcweir     {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX},    //Header - no pattern
84cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},   //AUTH_TYPE_ARTICLE,
85cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_BOOK,
86cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_BOOKLET,
87cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_CONFERENCE,
88cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_INBOOK,
89cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_INCOLLECTION,
90cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_INPROCEEDINGS,
91cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_JOURNAL,
92cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_MANUAL,
93cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_MASTERSTHESIS,
94cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_MISC,
95cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_PHDTHESIS,
96cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_PROCEEDINGS,
97cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_TECHREPORT,
98cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_UNPUBLISHED,
99cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_EMAIL,
100cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, AUTH_FIELD_URL, USHRT_MAX},//AUTH_TYPE_WWW,
101cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_CUSTOM1,
102cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_CUSTOM2,
103cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_CUSTOM3,
104cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_CUSTOM4,
105cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_TYPE_CUSTOM5,
106cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_YEAR,
107cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_URL,
108cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_CUSTOM1,
109cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_CUSTOM2,
110cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_CUSTOM3,
111cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_CUSTOM4,
112cdf0e10cSrcweir     {AUTH_FIELD_AUTHOR, AUTH_FIELD_TITLE, AUTH_FIELD_YEAR, USHRT_MAX, USHRT_MAX},     //AUTH_FIELD_CUSTOM5,
113cdf0e10cSrcweir     {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX}
114cdf0e10cSrcweir };
115cdf0e10cSrcweir 
lcl_GetAuthPattern(sal_uInt16 nTypeId)116cdf0e10cSrcweir SwFormTokens lcl_GetAuthPattern(sal_uInt16 nTypeId)
117cdf0e10cSrcweir {
118cdf0e10cSrcweir     SwFormTokens aRet;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     PatternIni aIni = aPatternIni[nTypeId];
121cdf0e10cSrcweir     sal_uInt16 nVals[5];
122cdf0e10cSrcweir     nVals[0] = aIni.n1;
123cdf0e10cSrcweir     nVals[1] = aIni.n2;
124cdf0e10cSrcweir     nVals[2] = aIni.n3;
125cdf0e10cSrcweir     nVals[3] = aIni.n4;
126cdf0e10cSrcweir     nVals[4] = aIni.n5;
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     SwFormToken aStartToken( TOKEN_AUTHORITY );
129cdf0e10cSrcweir     aStartToken.nAuthorityField = AUTH_FIELD_IDENTIFIER;
130cdf0e10cSrcweir     aRet.push_back( aStartToken );
131cdf0e10cSrcweir     SwFormToken aSeparatorToken( TOKEN_TEXT );
132cdf0e10cSrcweir     aSeparatorToken.sText = String::CreateFromAscii( ": " );
133cdf0e10cSrcweir     aRet.push_back( aSeparatorToken );
134cdf0e10cSrcweir     SwFormToken aTextToken( TOKEN_TEXT );
135cdf0e10cSrcweir     aTextToken.sText = String::CreateFromAscii( ", " );
136cdf0e10cSrcweir 
137cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < 5 ; i++)
138cdf0e10cSrcweir     {
139cdf0e10cSrcweir         if(nVals[i] == USHRT_MAX)
140cdf0e10cSrcweir             break;
141cdf0e10cSrcweir         if( i > 0 )
142cdf0e10cSrcweir             aRet.push_back( aTextToken );
143cdf0e10cSrcweir 
144cdf0e10cSrcweir          // -> #i21237#
145cdf0e10cSrcweir         SwFormToken aToken(TOKEN_AUTHORITY);
146cdf0e10cSrcweir 
147cdf0e10cSrcweir         aToken.nAuthorityField = nVals[i];
148cdf0e10cSrcweir         aRet.push_back(aToken);
149cdf0e10cSrcweir         // <- #i21237#
150cdf0e10cSrcweir     }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     return aRet;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir /*--------------------------------------------------------------------
155cdf0e10cSrcweir      Beschreibung:  Verzeichnis-Markierungen D/Ctor
156cdf0e10cSrcweir  --------------------------------------------------------------------*/
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 
159cdf0e10cSrcweir /// pool default constructor
SwTOXMark()160cdf0e10cSrcweir SwTOXMark::SwTOXMark()
161cdf0e10cSrcweir     : SfxPoolItem( RES_TXTATR_TOXMARK )
162cdf0e10cSrcweir     , SwModify( 0 )
163cdf0e10cSrcweir     ,
164cdf0e10cSrcweir     pTxtAttr( 0 ),
165cdf0e10cSrcweir     bAutoGenerated(sal_False),
166cdf0e10cSrcweir     bMainEntry(sal_False)
167cdf0e10cSrcweir {
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 
SwTOXMark(const SwTOXType * pTyp)171cdf0e10cSrcweir SwTOXMark::SwTOXMark( const SwTOXType* pTyp )
172cdf0e10cSrcweir     : SfxPoolItem( RES_TXTATR_TOXMARK )
173cdf0e10cSrcweir     , SwModify( const_cast<SwTOXType*>(pTyp) )
174cdf0e10cSrcweir     ,
175cdf0e10cSrcweir     pTxtAttr( 0 ), nLevel( 0 ),
176cdf0e10cSrcweir     bAutoGenerated(sal_False),
177cdf0e10cSrcweir     bMainEntry(sal_False)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 
SwTOXMark(const SwTOXMark & rCopy)182cdf0e10cSrcweir SwTOXMark::SwTOXMark( const SwTOXMark& rCopy )
183cdf0e10cSrcweir     : SfxPoolItem( RES_TXTATR_TOXMARK )
184cdf0e10cSrcweir     , SwModify(rCopy.GetRegisteredInNonConst())
185cdf0e10cSrcweir     ,
186cdf0e10cSrcweir     aPrimaryKey( rCopy.aPrimaryKey ), aSecondaryKey( rCopy.aSecondaryKey ),
187cdf0e10cSrcweir     aTextReading( rCopy.aTextReading ),
188cdf0e10cSrcweir     aPrimaryKeyReading( rCopy.aPrimaryKeyReading ),
189cdf0e10cSrcweir     aSecondaryKeyReading( rCopy.aSecondaryKeyReading ),
190cdf0e10cSrcweir     pTxtAttr( 0 ), nLevel( rCopy.nLevel ),
191cdf0e10cSrcweir     bAutoGenerated( rCopy.bAutoGenerated),
192cdf0e10cSrcweir     bMainEntry(rCopy.bMainEntry)
193cdf0e10cSrcweir {
194cdf0e10cSrcweir     // AlternativString kopieren
195cdf0e10cSrcweir     aAltText = rCopy.aAltText;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 
~SwTOXMark()199cdf0e10cSrcweir SwTOXMark::~SwTOXMark()
200cdf0e10cSrcweir {
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 
RegisterToTOXType(SwTOXType & rMark)204cdf0e10cSrcweir void SwTOXMark::RegisterToTOXType( SwTOXType& rMark )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir     rMark.Add(this);
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
operator ==(const SfxPoolItem & rAttr) const209cdf0e10cSrcweir int SwTOXMark::operator==( const SfxPoolItem& rAttr ) const
210cdf0e10cSrcweir {
211cdf0e10cSrcweir     ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" );
212cdf0e10cSrcweir     return GetRegisteredIn() == ((SwTOXMark&)rAttr).GetRegisteredIn();
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 
Clone(SfxItemPool *) const216cdf0e10cSrcweir SfxPoolItem* SwTOXMark::Clone( SfxItemPool* ) const
217cdf0e10cSrcweir {
218cdf0e10cSrcweir     return new SwTOXMark( *this );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir 
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)221cdf0e10cSrcweir void SwTOXMark::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew)
222cdf0e10cSrcweir {
223cdf0e10cSrcweir     NotifyClients(pOld, pNew);
224cdf0e10cSrcweir     if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which()))
225cdf0e10cSrcweir     {   // invalidate cached uno object
226cdf0e10cSrcweir         SetXTOXMark(::com::sun::star::uno::Reference<
227cdf0e10cSrcweir                         ::com::sun::star::text::XDocumentIndexMark>(0));
228cdf0e10cSrcweir     }
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
InvalidateTOXMark()231cdf0e10cSrcweir void SwTOXMark::InvalidateTOXMark()
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     SwPtrMsgPoolItem aMsgHint( RES_REMOVE_UNO_OBJECT,
234cdf0e10cSrcweir         &static_cast<SwModify&>(*this) ); // cast to base class!
235cdf0e10cSrcweir     NotifyClients(&aMsgHint, &aMsgHint);
236cdf0e10cSrcweir }
237cdf0e10cSrcweir 
GetText() const238cdf0e10cSrcweir String SwTOXMark::GetText() const
239cdf0e10cSrcweir {
240cdf0e10cSrcweir     String aStr;
241cdf0e10cSrcweir     if( aAltText.Len() )
242cdf0e10cSrcweir         aStr = aAltText;
243cdf0e10cSrcweir     else if( pTxtAttr && pTxtAttr->GetpTxtNd() )
244cdf0e10cSrcweir     {
245*69a74367SOliver-Rainer Wittmann         const xub_StrLen* pEndIdx = pTxtAttr->GetEnd();
246cdf0e10cSrcweir         ASSERT( pEndIdx, "TOXMark ohne Mark!!");
247cdf0e10cSrcweir         if( pEndIdx )
248cdf0e10cSrcweir         {
249cdf0e10cSrcweir             const xub_StrLen nStt = *pTxtAttr->GetStart();
250cdf0e10cSrcweir             aStr = pTxtAttr->GetpTxtNd()->GetExpandTxt( nStt, *pEndIdx-nStt );
251cdf0e10cSrcweir         }
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir     return aStr;
254cdf0e10cSrcweir }
255cdf0e10cSrcweir 
InsertTOXMarks(SwTOXMarks & aMarks,const SwTOXType & rType)256cdf0e10cSrcweir void SwTOXMark::InsertTOXMarks( SwTOXMarks& aMarks, const SwTOXType& rType )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir     SwIterator<SwTOXMark,SwTOXType> aIter(rType);
259cdf0e10cSrcweir     SwTOXMark* pMark = aIter.First();
260cdf0e10cSrcweir 	while( pMark )
261cdf0e10cSrcweir 	{
262cdf0e10cSrcweir 		if(pMark->GetTxtTOXMark())
263cdf0e10cSrcweir 			aMarks.C40_INSERT(SwTOXMark, pMark, aMarks.Count());
264cdf0e10cSrcweir         pMark = aIter.Next();
265cdf0e10cSrcweir 	}
266cdf0e10cSrcweir }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir /*--------------------------------------------------------------------
269cdf0e10cSrcweir      Beschreibung: Typen von Verzeichnissen verwalten
270cdf0e10cSrcweir  --------------------------------------------------------------------*/
271cdf0e10cSrcweir 
SwTOXType(TOXTypes eTyp,const String & rName)272cdf0e10cSrcweir SwTOXType::SwTOXType( TOXTypes eTyp, const String& rName )
273cdf0e10cSrcweir     : SwModify(0),
274cdf0e10cSrcweir     aName(rName),
275cdf0e10cSrcweir     eType(eTyp)
276cdf0e10cSrcweir {
277cdf0e10cSrcweir }
278cdf0e10cSrcweir 
279cdf0e10cSrcweir 
SwTOXType(const SwTOXType & rCopy)280cdf0e10cSrcweir SwTOXType::SwTOXType(const SwTOXType& rCopy)
281cdf0e10cSrcweir     : SwModify( (SwModify*)rCopy.GetRegisteredIn() ),
282cdf0e10cSrcweir     aName(rCopy.aName),
283cdf0e10cSrcweir     eType(rCopy.eType)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir /*--------------------------------------------------------------------
288cdf0e10cSrcweir     Beschreibung: Formen bearbeiten
289cdf0e10cSrcweir   --------------------------------------------------------------------*/
290cdf0e10cSrcweir 
SwForm(TOXTypes eTyp)291cdf0e10cSrcweir SwForm::SwForm( TOXTypes eTyp ) // #i21237#
292cdf0e10cSrcweir     : eType( eTyp ), nFormMaxLevel( SwForm::GetFormMaxLevel( eTyp )),
293cdf0e10cSrcweir //  nFirstTabPos( lNumIndent ),
294cdf0e10cSrcweir     bCommaSeparated(sal_False)
295cdf0e10cSrcweir {
296cdf0e10cSrcweir     //bHasFirstTabPos =
297cdf0e10cSrcweir     bGenerateTabPos = sal_False;
298cdf0e10cSrcweir     bIsRelTabPos = sal_True;
299cdf0e10cSrcweir 
300cdf0e10cSrcweir     // Inhaltsverzeichnis hat entsprechend Anzahl Headlines + Ueberschrift
301cdf0e10cSrcweir     // Benutzer hat 10 Ebenen + Ueberschrift
302cdf0e10cSrcweir     // Stichwort hat 3 Ebenen + Ueberschrift + Trenner
303cdf0e10cSrcweir     // indexes of tables, objects illustrations and authorities consist of a heading and one level
304cdf0e10cSrcweir 
305cdf0e10cSrcweir     sal_uInt16 nPoolId;
306cdf0e10cSrcweir     switch( eType )
307cdf0e10cSrcweir     {
308cdf0e10cSrcweir     case TOX_INDEX:         nPoolId = STR_POOLCOLL_TOX_IDXH;    break;
309cdf0e10cSrcweir     case TOX_USER:          nPoolId = STR_POOLCOLL_TOX_USERH;   break;
310cdf0e10cSrcweir     case TOX_CONTENT:       nPoolId = STR_POOLCOLL_TOX_CNTNTH;  break;
311cdf0e10cSrcweir     case TOX_ILLUSTRATIONS: nPoolId = STR_POOLCOLL_TOX_ILLUSH;  break;
312cdf0e10cSrcweir     case TOX_OBJECTS      : nPoolId = STR_POOLCOLL_TOX_OBJECTH; break;
313cdf0e10cSrcweir     case TOX_TABLES       : nPoolId = STR_POOLCOLL_TOX_TABLESH; break;
314cdf0e10cSrcweir     case TOX_AUTHORITIES  : nPoolId = STR_POOLCOLL_TOX_AUTHORITIESH;    break;
315cdf0e10cSrcweir     default:
316cdf0e10cSrcweir         ASSERT( !this, "ungueltiger TOXTyp");
317cdf0e10cSrcweir         return ;
318cdf0e10cSrcweir     }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir     SwFormTokens aTokens;
321cdf0e10cSrcweir     if (TOX_CONTENT == eType)
322cdf0e10cSrcweir     {
323cdf0e10cSrcweir         aTokens.push_back(SwFormToken(TOKEN_ENTRY_NO));
324cdf0e10cSrcweir         aTokens.push_back(SwFormToken(TOKEN_ENTRY_TEXT));
325cdf0e10cSrcweir     }
326cdf0e10cSrcweir     else
327cdf0e10cSrcweir         aTokens.push_back(SwFormToken(TOKEN_ENTRY));
328cdf0e10cSrcweir 
329cdf0e10cSrcweir     if (TOX_AUTHORITIES != eType)
330cdf0e10cSrcweir     {
331cdf0e10cSrcweir         SwFormToken aToken(TOKEN_TAB_STOP);
332cdf0e10cSrcweir         aToken.nTabStopPosition = 0;
333cdf0e10cSrcweir 
334cdf0e10cSrcweir         // --> FME 2004-12-10 #i36870# right aligned tab for all
335cdf0e10cSrcweir         aToken.cTabFillChar = '.';
336cdf0e10cSrcweir         aToken.eTabAlign = SVX_TAB_ADJUST_END;
337cdf0e10cSrcweir         // <--
338cdf0e10cSrcweir 
339cdf0e10cSrcweir         aTokens.push_back(aToken);
340cdf0e10cSrcweir         aTokens.push_back(SwFormToken(TOKEN_PAGE_NUMS));
341cdf0e10cSrcweir     }
342cdf0e10cSrcweir 
343cdf0e10cSrcweir     SetTemplate( 0, SW_RESSTR( nPoolId++ ));
344cdf0e10cSrcweir 
345cdf0e10cSrcweir     if(TOX_INDEX == eType)
346cdf0e10cSrcweir     {
347cdf0e10cSrcweir         for( sal_uInt16 i = 1; i < 5; ++i  )
348cdf0e10cSrcweir         {
349cdf0e10cSrcweir             if(1 == i)
350cdf0e10cSrcweir             {
351cdf0e10cSrcweir                 SwFormTokens aTmpTokens;
352cdf0e10cSrcweir                 SwFormToken aTmpToken(TOKEN_ENTRY);
353cdf0e10cSrcweir                 aTmpTokens.push_back(aTmpToken);
354cdf0e10cSrcweir 
355cdf0e10cSrcweir                 SetPattern( i, aTmpTokens );
356cdf0e10cSrcweir                 SetTemplate( i, SW_RESSTR( STR_POOLCOLL_TOX_IDXBREAK    ));
357cdf0e10cSrcweir             }
358cdf0e10cSrcweir             else
359cdf0e10cSrcweir             {
360cdf0e10cSrcweir                 SetPattern( i, aTokens );
361cdf0e10cSrcweir                 SetTemplate( i, SW_RESSTR( STR_POOLCOLL_TOX_IDX1 + i - 2 ));
362cdf0e10cSrcweir             }
363cdf0e10cSrcweir         }
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir     else
366cdf0e10cSrcweir         for( sal_uInt16 i = 1; i < GetFormMax(); ++i, ++nPoolId )    // Nr 0 ist der Titel
367cdf0e10cSrcweir         {
368cdf0e10cSrcweir             if(TOX_AUTHORITIES == eType)
369cdf0e10cSrcweir                 SetPattern(i, lcl_GetAuthPattern(i));
370cdf0e10cSrcweir             else
371cdf0e10cSrcweir                 SetPattern( i, aTokens );
372cdf0e10cSrcweir 
373cdf0e10cSrcweir             if( TOX_CONTENT == eType && 6 == i )
374cdf0e10cSrcweir                 nPoolId = STR_POOLCOLL_TOX_CNTNT6;
375cdf0e10cSrcweir             else if( TOX_USER == eType && 6 == i )
376cdf0e10cSrcweir                 nPoolId = STR_POOLCOLL_TOX_USER6;
377cdf0e10cSrcweir             else if( TOX_AUTHORITIES == eType )
378cdf0e10cSrcweir                 nPoolId = STR_POOLCOLL_TOX_AUTHORITIES1;
379cdf0e10cSrcweir             SetTemplate( i, SW_RESSTR( nPoolId ) );
380cdf0e10cSrcweir         }
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 
SwForm(const SwForm & rForm)384cdf0e10cSrcweir SwForm::SwForm(const SwForm& rForm)
385cdf0e10cSrcweir     : eType( rForm.eType )
386cdf0e10cSrcweir {
387cdf0e10cSrcweir     *this = rForm;
388cdf0e10cSrcweir }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir 
operator =(const SwForm & rForm)391cdf0e10cSrcweir SwForm& SwForm::operator=(const SwForm& rForm)
392cdf0e10cSrcweir {
393cdf0e10cSrcweir     eType = rForm.eType;
394cdf0e10cSrcweir     nFormMaxLevel = rForm.nFormMaxLevel;
395cdf0e10cSrcweir //  nFirstTabPos = rForm.nFirstTabPos;
396cdf0e10cSrcweir //  bHasFirstTabPos = rForm.bHasFirstTabPos;
397cdf0e10cSrcweir     bGenerateTabPos = rForm.bGenerateTabPos;
398cdf0e10cSrcweir     bIsRelTabPos = rForm.bIsRelTabPos;
399cdf0e10cSrcweir     bCommaSeparated = rForm.bCommaSeparated;
400cdf0e10cSrcweir     for(sal_uInt16 i=0; i < nFormMaxLevel; ++i)
401cdf0e10cSrcweir     {
402cdf0e10cSrcweir         aPattern[i] = rForm.aPattern[i];
403cdf0e10cSrcweir         aTemplate[i] = rForm.aTemplate[i];
404cdf0e10cSrcweir     }
405cdf0e10cSrcweir     return *this;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
GetFormMaxLevel(TOXTypes eTOXType)408cdf0e10cSrcweir sal_uInt16 SwForm::GetFormMaxLevel( TOXTypes eTOXType )
409cdf0e10cSrcweir {
410cdf0e10cSrcweir     sal_uInt16 nRet = 0;
411cdf0e10cSrcweir     switch( eTOXType )
412cdf0e10cSrcweir     {
413cdf0e10cSrcweir         case TOX_INDEX:         nRet = 5;                   break;
414cdf0e10cSrcweir         case TOX_USER:          nRet = MAXLEVEL+1;          break;
415cdf0e10cSrcweir         case TOX_CONTENT:       nRet = MAXLEVEL+1;          break;
416cdf0e10cSrcweir         case TOX_ILLUSTRATIONS:
417cdf0e10cSrcweir         case TOX_OBJECTS      :
418cdf0e10cSrcweir         case TOX_TABLES       : nRet = 2; break;
419cdf0e10cSrcweir         case TOX_AUTHORITIES  : nRet = AUTH_TYPE_END + 1;       break;
420cdf0e10cSrcweir     }
421cdf0e10cSrcweir     return nRet;
422cdf0e10cSrcweir }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir // #i21237#
operator ==(const SwFormToken & rToken,FormTokenType eType)425cdf0e10cSrcweir bool operator == (const SwFormToken & rToken, FormTokenType eType)
426cdf0e10cSrcweir {
427cdf0e10cSrcweir     return rToken.eTokenType == eType;
428cdf0e10cSrcweir }
429cdf0e10cSrcweir 
430cdf0e10cSrcweir //-----------------------------------------------------------------------------
AdjustTabStops(SwDoc & rDoc,sal_Bool bInsertNewTapStops)431cdf0e10cSrcweir void SwForm::AdjustTabStops(SwDoc& rDoc, sal_Bool bInsertNewTapStops) // #i21237#
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     for(sal_uInt16 nLevel = 1; nLevel < GetFormMax(); nLevel++)
434cdf0e10cSrcweir     {
435cdf0e10cSrcweir         const String& sTemplateName = GetTemplate(nLevel);
436cdf0e10cSrcweir 
437cdf0e10cSrcweir         SwTxtFmtColl* pColl = rDoc.FindTxtFmtCollByName( sTemplateName );
438cdf0e10cSrcweir         if( !pColl )
439cdf0e10cSrcweir         {
440cdf0e10cSrcweir             sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName
441cdf0e10cSrcweir                 ( sTemplateName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); // #i21237#
442cdf0e10cSrcweir             if( USHRT_MAX != nId )
443cdf0e10cSrcweir                 pColl = rDoc.GetTxtCollFromPool( nId );
444cdf0e10cSrcweir         }
445cdf0e10cSrcweir 
446cdf0e10cSrcweir         const SvxTabStopItem* pTabStops = 0;
447cdf0e10cSrcweir         sal_uInt16 nTabCount = 0;
448cdf0e10cSrcweir         if( pColl &&
449cdf0e10cSrcweir             0 != ( pTabStops = &pColl->GetTabStops(sal_False) ) &&
450cdf0e10cSrcweir             0 != ( nTabCount = pTabStops->Count() ) )
451cdf0e10cSrcweir         {
452cdf0e10cSrcweir             // #i21237#
453cdf0e10cSrcweir             SwFormTokens aCurrentPattern = GetPattern(nLevel);
454cdf0e10cSrcweir             SwFormTokens::iterator aIt = aCurrentPattern.begin();
455cdf0e10cSrcweir 
456cdf0e10cSrcweir             sal_Bool bChanged = sal_False;
457cdf0e10cSrcweir 
458cdf0e10cSrcweir             for(sal_uInt16 nTab = 0; nTab < nTabCount; ++nTab)
459cdf0e10cSrcweir             {
460cdf0e10cSrcweir                 const SvxTabStop& rTab = (*pTabStops)[nTab];
461cdf0e10cSrcweir 
462cdf0e10cSrcweir                 // --> FME 2004-12-16 #i29178#
463cdf0e10cSrcweir                 // For Word import, we do not want to replace exising tokens,
464cdf0e10cSrcweir                 // we insert new tabstop tokens without a tabstop character:
465cdf0e10cSrcweir                 if ( bInsertNewTapStops )
466cdf0e10cSrcweir                 {
467cdf0e10cSrcweir                     if ( SVX_TAB_ADJUST_DEFAULT != rTab.GetAdjustment() )
468cdf0e10cSrcweir                     {
469cdf0e10cSrcweir                         bChanged = sal_True;
470cdf0e10cSrcweir                         SwFormToken aToken(TOKEN_TAB_STOP);
471cdf0e10cSrcweir                         aToken.bWithTab = sal_False;
472cdf0e10cSrcweir                         aToken.nTabStopPosition = rTab.GetTabPos();
473cdf0e10cSrcweir                         aToken.eTabAlign = rTab.GetAdjustment();
474cdf0e10cSrcweir                         aToken.cTabFillChar = rTab.GetFill();
475cdf0e10cSrcweir                         aCurrentPattern.push_back(aToken);
476cdf0e10cSrcweir                     }
477cdf0e10cSrcweir                 }
478cdf0e10cSrcweir                 // <--
479cdf0e10cSrcweir                 else
480cdf0e10cSrcweir                 {
481cdf0e10cSrcweir                     aIt = find_if(aIt, aCurrentPattern.end(),
482cdf0e10cSrcweir                                   SwFormTokenEqualToFormTokenType
483cdf0e10cSrcweir                                   (TOKEN_TAB_STOP));
484cdf0e10cSrcweir                     if ( aIt != aCurrentPattern.end() )
485cdf0e10cSrcweir                     {
486cdf0e10cSrcweir                         bChanged = sal_True;
487cdf0e10cSrcweir                         aIt->nTabStopPosition = rTab.GetTabPos();
488cdf0e10cSrcweir                         aIt->eTabAlign = nTab == nTabCount - 1 &&
489cdf0e10cSrcweir                                          SVX_TAB_ADJUST_RIGHT == rTab.GetAdjustment() ?
490cdf0e10cSrcweir                                          SVX_TAB_ADJUST_END :
491cdf0e10cSrcweir                                          rTab.GetAdjustment();
492cdf0e10cSrcweir                         aIt->cTabFillChar = rTab.GetFill();
493cdf0e10cSrcweir                         ++aIt;
494cdf0e10cSrcweir                     }
495cdf0e10cSrcweir                     else
496cdf0e10cSrcweir                         break; // no more tokens to replace
497cdf0e10cSrcweir                 }
498cdf0e10cSrcweir             }
499cdf0e10cSrcweir             // <--
500cdf0e10cSrcweir 
501cdf0e10cSrcweir             if(bChanged)
502cdf0e10cSrcweir                 SetPattern(nLevel, aCurrentPattern); // #i21237#
503cdf0e10cSrcweir         }
504cdf0e10cSrcweir     }
505cdf0e10cSrcweir }
506cdf0e10cSrcweir /*--------------------------------------------------------------------
507cdf0e10cSrcweir      Beschreibung: Ctor TOXBase
508cdf0e10cSrcweir  --------------------------------------------------------------------*/
509cdf0e10cSrcweir 
510cdf0e10cSrcweir 
SwTOXBase(const SwTOXType * pTyp,const SwForm & rForm,sal_uInt16 nCreaType,const String & rTitle)511cdf0e10cSrcweir SwTOXBase::SwTOXBase(const SwTOXType* pTyp, const SwForm& rForm,
512cdf0e10cSrcweir                      sal_uInt16 nCreaType, const String& rTitle )
513f66c5aafSOliver-Rainer Wittmann     : SwClient((SwModify*)pTyp)
514f66c5aafSOliver-Rainer Wittmann     , aForm(rForm)
515f66c5aafSOliver-Rainer Wittmann     , aTitle(rTitle)
516f66c5aafSOliver-Rainer Wittmann     , eLanguage((LanguageType)::GetAppLanguage())
517f66c5aafSOliver-Rainer Wittmann     , nCreateType(nCreaType)
518f66c5aafSOliver-Rainer Wittmann     , nOLEOptions(0)
519f66c5aafSOliver-Rainer Wittmann     , eCaptionDisplay(CAPTION_COMPLETE)
520f66c5aafSOliver-Rainer Wittmann     , bProtected( sal_True )
521f66c5aafSOliver-Rainer Wittmann     , bFromChapter(sal_False)
522f66c5aafSOliver-Rainer Wittmann     , bFromObjectNames(sal_False)
523f66c5aafSOliver-Rainer Wittmann     , bLevelFromChapter(sal_False)
524f66c5aafSOliver-Rainer Wittmann     , maMSTOCExpression()
525f66c5aafSOliver-Rainer Wittmann     , mbKeepExpression(sal_True)
526cdf0e10cSrcweir {
527cdf0e10cSrcweir     aData.nOptions = 0;
528cdf0e10cSrcweir }
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 
SwTOXBase(const SwTOXBase & rSource,SwDoc * pDoc)531cdf0e10cSrcweir SwTOXBase::SwTOXBase( const SwTOXBase& rSource, SwDoc* pDoc )
532cdf0e10cSrcweir     : SwClient( rSource.GetRegisteredInNonConst() )
533f66c5aafSOliver-Rainer Wittmann     , mbKeepExpression(sal_True)
534cdf0e10cSrcweir {
535cdf0e10cSrcweir     CopyTOXBase( pDoc, rSource );
536cdf0e10cSrcweir }
537cdf0e10cSrcweir 
RegisterToTOXType(SwTOXType & rType)538cdf0e10cSrcweir void SwTOXBase::RegisterToTOXType( SwTOXType& rType )
539cdf0e10cSrcweir {
540cdf0e10cSrcweir     rType.Add( this );
541cdf0e10cSrcweir }
542cdf0e10cSrcweir 
CopyTOXBase(SwDoc * pDoc,const SwTOXBase & rSource)543cdf0e10cSrcweir SwTOXBase& SwTOXBase::CopyTOXBase( SwDoc* pDoc, const SwTOXBase& rSource )
544cdf0e10cSrcweir {
545f66c5aafSOliver-Rainer Wittmann     maMSTOCExpression = rSource.maMSTOCExpression;
546cdf0e10cSrcweir     SwTOXType* pType = (SwTOXType*)rSource.GetTOXType();
547cdf0e10cSrcweir     if( pDoc && USHRT_MAX == pDoc->GetTOXTypes().GetPos( pType ))
548cdf0e10cSrcweir     {
549cdf0e10cSrcweir         // type not in pDoc, so create it now
550cdf0e10cSrcweir         const SwTOXTypes& rTypes = pDoc->GetTOXTypes();
551cdf0e10cSrcweir         sal_Bool bFound = sal_False;
552cdf0e10cSrcweir         for( sal_uInt16 n = rTypes.Count(); n; )
553cdf0e10cSrcweir         {
554cdf0e10cSrcweir             const SwTOXType* pCmp = rTypes[ --n ];
555cdf0e10cSrcweir             if( pCmp->GetType() == pType->GetType() &&
556cdf0e10cSrcweir                 pCmp->GetTypeName() == pType->GetTypeName() )
557cdf0e10cSrcweir             {
558cdf0e10cSrcweir                 pType = (SwTOXType*)pCmp;
559cdf0e10cSrcweir                 bFound = sal_True;
560cdf0e10cSrcweir                 break;
561cdf0e10cSrcweir             }
562cdf0e10cSrcweir         }
563cdf0e10cSrcweir 
564cdf0e10cSrcweir         if( !bFound )
565cdf0e10cSrcweir             pType = (SwTOXType*)pDoc->InsertTOXType( *pType );
566cdf0e10cSrcweir     }
567cdf0e10cSrcweir     pType->Add( this );
568cdf0e10cSrcweir 
569cdf0e10cSrcweir     nCreateType = rSource.nCreateType;
570cdf0e10cSrcweir     aTitle      = rSource.aTitle;
571cdf0e10cSrcweir     aForm       = rSource.aForm;
572cdf0e10cSrcweir     bProtected  = rSource.bProtected;
573cdf0e10cSrcweir     bFromChapter = rSource.bFromChapter;
574cdf0e10cSrcweir     bFromObjectNames = rSource.bFromObjectNames;
575cdf0e10cSrcweir     sMainEntryCharStyle = rSource.sMainEntryCharStyle;
576cdf0e10cSrcweir     sSequenceName = rSource.sSequenceName;
577cdf0e10cSrcweir     eCaptionDisplay = rSource.eCaptionDisplay;
578cdf0e10cSrcweir     nOLEOptions = rSource.nOLEOptions;
579cdf0e10cSrcweir     eLanguage = rSource.eLanguage;
580cdf0e10cSrcweir     sSortAlgorithm = rSource.sSortAlgorithm;
581cdf0e10cSrcweir 
582cdf0e10cSrcweir     for( sal_uInt16 i = 0; i < MAXLEVEL; ++i )
583cdf0e10cSrcweir         aStyleNames[i] = rSource.aStyleNames[i];
584cdf0e10cSrcweir 
585cdf0e10cSrcweir     // its the same data type!
586cdf0e10cSrcweir     aData.nOptions =  rSource.aData.nOptions;
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     if( !pDoc || pDoc->IsCopyIsMove() )
589cdf0e10cSrcweir         aName = rSource.GetTOXName();
590cdf0e10cSrcweir     else
591cdf0e10cSrcweir         aName = pDoc->GetUniqueTOXBaseName( *pType, &rSource.GetTOXName() );
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     return *this;
594cdf0e10cSrcweir }
595cdf0e10cSrcweir 
596cdf0e10cSrcweir /*--------------------------------------------------------------------
597cdf0e10cSrcweir      Beschreibung: Verzeichnisspezifische Funktionen
598cdf0e10cSrcweir  --------------------------------------------------------------------*/
599cdf0e10cSrcweir 
~SwTOXBase()600cdf0e10cSrcweir SwTOXBase::~SwTOXBase()
601cdf0e10cSrcweir {
602cdf0e10cSrcweir //    if( GetTOXType()->GetType() == TOX_USER  )
603cdf0e10cSrcweir //        delete aData.pTemplateName;
604cdf0e10cSrcweir }
605cdf0e10cSrcweir 
SetTitle(const String & rTitle)606cdf0e10cSrcweir void SwTOXBase::SetTitle(const String& rTitle)
607cdf0e10cSrcweir 	{	aTitle = rTitle; }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir 
operator =(const SwTOXBase & rSource)610cdf0e10cSrcweir SwTOXBase & SwTOXBase::operator = (const SwTOXBase & rSource)
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     ByteString aTmpStr(aTitle, RTL_TEXTENCODING_ASCII_US);
613cdf0e10cSrcweir     ByteString aTmpStr1(rSource.aTitle, RTL_TEXTENCODING_ASCII_US);
614cdf0e10cSrcweir 
615cdf0e10cSrcweir     aForm = rSource.aForm;
616cdf0e10cSrcweir     aName = rSource.aName;
617cdf0e10cSrcweir     aTitle = rSource.aTitle;
618cdf0e10cSrcweir     sMainEntryCharStyle = rSource.sMainEntryCharStyle;
619cdf0e10cSrcweir     for(sal_uInt16 nLevel = 0; nLevel < MAXLEVEL; nLevel++)
620cdf0e10cSrcweir         aStyleNames[nLevel] = rSource.aStyleNames[nLevel];
621cdf0e10cSrcweir     sSequenceName = rSource.sSequenceName;
622cdf0e10cSrcweir     eLanguage = rSource.eLanguage;
623cdf0e10cSrcweir     sSortAlgorithm = rSource.sSortAlgorithm;
624cdf0e10cSrcweir     aData = rSource.aData;
625cdf0e10cSrcweir     nCreateType = rSource.nCreateType;
626cdf0e10cSrcweir     nOLEOptions = rSource.nOLEOptions;
627cdf0e10cSrcweir     eCaptionDisplay = rSource.eCaptionDisplay;
628cdf0e10cSrcweir     bProtected = rSource.bProtected;
629cdf0e10cSrcweir     bFromChapter = rSource.bFromChapter;
630cdf0e10cSrcweir     bFromObjectNames = rSource.bFromObjectNames;
631cdf0e10cSrcweir     bLevelFromChapter = rSource.bLevelFromChapter;
632cdf0e10cSrcweir 
633cdf0e10cSrcweir     if (rSource.GetAttrSet())
634cdf0e10cSrcweir         SetAttrSet(*rSource.GetAttrSet());
635cdf0e10cSrcweir 
636cdf0e10cSrcweir     return *this;
637cdf0e10cSrcweir }
638cdf0e10cSrcweir 
639cdf0e10cSrcweir /* -----------------16.07.99 16:02-------------------
640cdf0e10cSrcweir 
641cdf0e10cSrcweir SwTOXBase & SwTOXBase::operator = (const SwTOXBase & rSource)
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     aForm = rSource.aForm;
644cdf0e10cSrcweir     aName = rSource.aName;
645cdf0e10cSrcweir     aTitle = rSource.aTitle;
646cdf0e10cSrcweir     sMainEntryCharStyle = rSource.sMainEntryCharStyle;
647cdf0e10cSrcweir     sSequenceName = rSource.sSequenceName;
648cdf0e10cSrcweir     eLanguage = rSource.eLanguage;
649cdf0e10cSrcweir     sSortAlgorithm = rSource.sSortAlgorithm;
650cdf0e10cSrcweir     aData = rSource.aData;
651cdf0e10cSrcweir     nCreateType = rSource.nCreateType;
652cdf0e10cSrcweir     nOLEOptions = rSource.nOLEOptions;
653cdf0e10cSrcweir     eCaptionDisplay = rSource.eCaptionDisplay;
654cdf0e10cSrcweir     bProtected = rSource.bProtected;
655cdf0e10cSrcweir     bFromChapter = rSource.bFromChapter;
656cdf0e10cSrcweir     bFromObjectNames = rSource.bFromObjectNames;
657cdf0e10cSrcweir     bLevelFromChapter = rSource.bLevelFromChapter;
658cdf0e10cSrcweir 
659cdf0e10cSrcweir     if (rSource.GetAttrSet())
660cdf0e10cSrcweir         SetAttrSet(*rSource.GetAttrSet());
661cdf0e10cSrcweir 
662cdf0e10cSrcweir     return *this;
663cdf0e10cSrcweir }
664cdf0e10cSrcweir 
665cdf0e10cSrcweir  --------------------------------------------------*/
666cdf0e10cSrcweir 
GetString() const667cdf0e10cSrcweir String SwFormToken::GetString() const
668cdf0e10cSrcweir {
669cdf0e10cSrcweir     String sRet;
670cdf0e10cSrcweir 
671cdf0e10cSrcweir     sal_Bool bAppend = sal_True;
672cdf0e10cSrcweir     switch( eTokenType )
673cdf0e10cSrcweir     {
674cdf0e10cSrcweir         case TOKEN_ENTRY_NO:
675cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormEntryNum );
676cdf0e10cSrcweir         break;
677cdf0e10cSrcweir         case TOKEN_ENTRY_TEXT:
678cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormEntryTxt );
679cdf0e10cSrcweir         break;
680cdf0e10cSrcweir         case TOKEN_ENTRY:
681cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormEntry );
682cdf0e10cSrcweir         break;
683cdf0e10cSrcweir         case TOKEN_TAB_STOP:
684cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormTab );
685cdf0e10cSrcweir         break;
686cdf0e10cSrcweir         case TOKEN_TEXT:
687cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormText );
688cdf0e10cSrcweir         break;
689cdf0e10cSrcweir         case TOKEN_PAGE_NUMS:
690cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormPageNums );
691cdf0e10cSrcweir         break;
692cdf0e10cSrcweir         case TOKEN_CHAPTER_INFO:
693cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormChapterMark );
694cdf0e10cSrcweir         break;
695cdf0e10cSrcweir         case TOKEN_LINK_START:
696cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormLinkStt );
697cdf0e10cSrcweir         break;
698cdf0e10cSrcweir         case TOKEN_LINK_END:
699cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormLinkEnd );
700cdf0e10cSrcweir         break;
701cdf0e10cSrcweir         case TOKEN_AUTHORITY:
702cdf0e10cSrcweir         {
703cdf0e10cSrcweir             sRet.AssignAscii( SwForm::aFormAuth );
704cdf0e10cSrcweir             String sTmp( String::CreateFromInt32( nAuthorityField ));
705cdf0e10cSrcweir             if( sTmp.Len() < 2 )
706cdf0e10cSrcweir                 sTmp.Insert('0', 0);
707cdf0e10cSrcweir             sRet.Insert( sTmp, 2 );
708cdf0e10cSrcweir         }
709cdf0e10cSrcweir         break;
710cdf0e10cSrcweir         case TOKEN_END:
711cdf0e10cSrcweir         break;
712cdf0e10cSrcweir     }
713cdf0e10cSrcweir     sRet.Erase( sRet.Len() - 1 );
714cdf0e10cSrcweir     sRet += ' ';
715cdf0e10cSrcweir     sRet += sCharStyleName;
716cdf0e10cSrcweir     sRet += ',';
717cdf0e10cSrcweir     sRet += String::CreateFromInt32( nPoolId );
718cdf0e10cSrcweir     sRet += ',';
719cdf0e10cSrcweir 
720cdf0e10cSrcweir     // TabStopPosition and TabAlign or ChapterInfoFormat
721cdf0e10cSrcweir     if(TOKEN_TAB_STOP == eTokenType)
722cdf0e10cSrcweir     {
723cdf0e10cSrcweir         sRet += String::CreateFromInt32( nTabStopPosition );
724cdf0e10cSrcweir         sRet += ',';
725cdf0e10cSrcweir         sRet += String::CreateFromInt32( static_cast< sal_Int32 >(eTabAlign) );
726cdf0e10cSrcweir         sRet += ',';
727cdf0e10cSrcweir         sRet += cTabFillChar;
728cdf0e10cSrcweir         sRet += ',';
729cdf0e10cSrcweir         sRet += String::CreateFromInt32( bWithTab );
730cdf0e10cSrcweir     }
731cdf0e10cSrcweir     else if(TOKEN_CHAPTER_INFO == eTokenType)
732cdf0e10cSrcweir     {
733cdf0e10cSrcweir         sRet += String::CreateFromInt32( nChapterFormat );
734cdf0e10cSrcweir //add maximum permetted level
735cdf0e10cSrcweir         sRet += ',';
736cdf0e10cSrcweir         sRet += String::CreateFromInt32( nOutlineLevel );
737cdf0e10cSrcweir     }
738cdf0e10cSrcweir     else if(TOKEN_TEXT == eTokenType)
739cdf0e10cSrcweir     {
740cdf0e10cSrcweir         //append Text if Len() > 0 only!
741cdf0e10cSrcweir         if( sText.Len() )
742cdf0e10cSrcweir         {
743cdf0e10cSrcweir             sRet += TOX_STYLE_DELIMITER;
744cdf0e10cSrcweir             String sTmp( sText );
745cdf0e10cSrcweir             sTmp.EraseAllChars( TOX_STYLE_DELIMITER );
746cdf0e10cSrcweir             sRet += sTmp;
747cdf0e10cSrcweir             sRet += TOX_STYLE_DELIMITER;
748cdf0e10cSrcweir         }
749cdf0e10cSrcweir         else
750cdf0e10cSrcweir             bAppend = sal_False;
751cdf0e10cSrcweir     }
752cdf0e10cSrcweir     else if(TOKEN_ENTRY_NO == eTokenType)
753cdf0e10cSrcweir     {
754cdf0e10cSrcweir         sRet += String::CreateFromInt32( nChapterFormat );
755cdf0e10cSrcweir //add maximum permitted level
756cdf0e10cSrcweir         sRet += ',';
757cdf0e10cSrcweir         sRet += String::CreateFromInt32( nOutlineLevel );
758cdf0e10cSrcweir     }
759cdf0e10cSrcweir 
760cdf0e10cSrcweir     if(bAppend)
761cdf0e10cSrcweir     {
762cdf0e10cSrcweir         sRet += '>';
763cdf0e10cSrcweir     }
764cdf0e10cSrcweir     else
765cdf0e10cSrcweir     {
766cdf0e10cSrcweir         // don't append empty text tokens
767cdf0e10cSrcweir         sRet.Erase();
768cdf0e10cSrcweir     }
769cdf0e10cSrcweir 
770cdf0e10cSrcweir     return sRet;
771cdf0e10cSrcweir }
772cdf0e10cSrcweir 
773cdf0e10cSrcweir // -> #i21237#
SwFormTokensHelper(const String & rPattern)774cdf0e10cSrcweir SwFormTokensHelper::SwFormTokensHelper(const String & rPattern)
775cdf0e10cSrcweir {
776cdf0e10cSrcweir     xub_StrLen nCurPatternPos = 0;
777cdf0e10cSrcweir     xub_StrLen nCurPatternLen = 0;
778cdf0e10cSrcweir 
779cdf0e10cSrcweir     while (nCurPatternPos < rPattern.Len())
780cdf0e10cSrcweir     {
781cdf0e10cSrcweir         nCurPatternPos = nCurPatternPos + nCurPatternLen;
782cdf0e10cSrcweir 
783cdf0e10cSrcweir         SwFormToken aToken = BuildToken(rPattern, nCurPatternPos);
784cdf0e10cSrcweir         aTokens.push_back(aToken);
785cdf0e10cSrcweir     }
786cdf0e10cSrcweir }
787cdf0e10cSrcweir 
BuildToken(const String & sPattern,xub_StrLen & nCurPatternPos) const788cdf0e10cSrcweir SwFormToken SwFormTokensHelper::BuildToken( const String & sPattern,
789cdf0e10cSrcweir                                            xub_StrLen & nCurPatternPos ) const
790cdf0e10cSrcweir {
791cdf0e10cSrcweir     String sToken( SearchNextToken(sPattern, nCurPatternPos) );
792cdf0e10cSrcweir     nCurPatternPos = nCurPatternPos + sToken.Len();
793cdf0e10cSrcweir     xub_StrLen nTokenLen;
794cdf0e10cSrcweir     FormTokenType eTokenType = GetTokenType(sToken, &nTokenLen);
795cdf0e10cSrcweir 
796cdf0e10cSrcweir     // at this point sPattern contains the
797cdf0e10cSrcweir     // character style name, the PoolId, tab stop position, tab stop alignment, chapter info format
798cdf0e10cSrcweir     // the form is: CharStyleName, PoolId[, TabStopPosition|ChapterInfoFormat[, TabStopAlignment[, TabFillChar]]]
799cdf0e10cSrcweir     // in text tokens the form differs from the others: CharStyleName, PoolId[,\0xffinserted text\0xff]
800cdf0e10cSrcweir     SwFormToken eRet( eTokenType );
801cdf0e10cSrcweir     String sAuthFieldEnum = sToken.Copy( 2, 2 );
802cdf0e10cSrcweir     sToken = sToken.Copy( nTokenLen, sToken.Len() - nTokenLen - 1);
803cdf0e10cSrcweir 
804cdf0e10cSrcweir     eRet.sCharStyleName = sToken.GetToken( 0, ',');
805cdf0e10cSrcweir     String sTmp( sToken.GetToken( 1, ',' ));
806cdf0e10cSrcweir     if( sTmp.Len() )
807cdf0e10cSrcweir         eRet.nPoolId = static_cast<sal_uInt16>(sTmp.ToInt32());
808cdf0e10cSrcweir 
809cdf0e10cSrcweir     switch( eTokenType )
810cdf0e10cSrcweir     {
811cdf0e10cSrcweir //i53420
812cdf0e10cSrcweir     case TOKEN_ENTRY_NO:
813cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 2, ',' ) ).Len() )
814cdf0e10cSrcweir             eRet.nChapterFormat = static_cast<sal_uInt16>(sTmp.ToInt32());
815cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 3, ',' ) ).Len() )
816cdf0e10cSrcweir             eRet.nOutlineLevel = static_cast<sal_uInt16>(sTmp.ToInt32()); //the maximum outline level to examine
817cdf0e10cSrcweir         break;
818cdf0e10cSrcweir 
819cdf0e10cSrcweir     case TOKEN_TEXT:
820cdf0e10cSrcweir         {
821cdf0e10cSrcweir             xub_StrLen nStartText = sToken.Search( TOX_STYLE_DELIMITER );
822cdf0e10cSrcweir             if( STRING_NOTFOUND != nStartText )
823cdf0e10cSrcweir             {
824cdf0e10cSrcweir                 xub_StrLen nEndText = sToken.Search( TOX_STYLE_DELIMITER,
825cdf0e10cSrcweir                                                 nStartText + 1);
826cdf0e10cSrcweir                 if( STRING_NOTFOUND != nEndText )
827cdf0e10cSrcweir                 {
828cdf0e10cSrcweir                     eRet.sText = sToken.Copy( nStartText + 1,
829cdf0e10cSrcweir                                                 nEndText - nStartText - 1);
830cdf0e10cSrcweir                 }
831cdf0e10cSrcweir             }
832cdf0e10cSrcweir         }
833cdf0e10cSrcweir         break;
834cdf0e10cSrcweir 
835cdf0e10cSrcweir     case TOKEN_TAB_STOP:
836cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 2, ',' ) ).Len() )
837cdf0e10cSrcweir             eRet.nTabStopPosition = sTmp.ToInt32();
838cdf0e10cSrcweir 
839cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 3, ',' ) ).Len() )
840cdf0e10cSrcweir             eRet.eTabAlign = static_cast<SvxTabAdjust>(sTmp.ToInt32());
841cdf0e10cSrcweir 
842cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 4, ',' ) ).Len() )
843cdf0e10cSrcweir             eRet.cTabFillChar = sTmp.GetChar(0);
844cdf0e10cSrcweir 
845cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 5, ',' ) ).Len() )
846cdf0e10cSrcweir             eRet.bWithTab = 0 != sTmp.ToInt32();
847cdf0e10cSrcweir         break;
848cdf0e10cSrcweir 
849cdf0e10cSrcweir     case TOKEN_CHAPTER_INFO:
850cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 2, ',' ) ).Len() )
851cdf0e10cSrcweir             eRet.nChapterFormat = static_cast<sal_uInt16>(sTmp.ToInt32()); //SwChapterFormat;
852cdf0e10cSrcweir  //i53420
853cdf0e10cSrcweir         if( (sTmp = sToken.GetToken( 3, ',' ) ).Len() )
854cdf0e10cSrcweir             eRet.nOutlineLevel = static_cast<sal_uInt16>(sTmp.ToInt32()); //the maximum outline level to examine
855cdf0e10cSrcweir 
856cdf0e10cSrcweir         break;
857cdf0e10cSrcweir 
858cdf0e10cSrcweir     case TOKEN_AUTHORITY:
859cdf0e10cSrcweir         eRet.nAuthorityField = static_cast<sal_uInt16>(sAuthFieldEnum.ToInt32());
860cdf0e10cSrcweir         break;
861cdf0e10cSrcweir     default: break;
862cdf0e10cSrcweir     }
863cdf0e10cSrcweir     return eRet;
864cdf0e10cSrcweir }
865cdf0e10cSrcweir 
SearchNextToken(const String & sPattern,xub_StrLen nStt) const866cdf0e10cSrcweir String SwFormTokensHelper::SearchNextToken( const String & sPattern,
867cdf0e10cSrcweir                                             xub_StrLen nStt ) const
868cdf0e10cSrcweir {
869cdf0e10cSrcweir     //it's not so easy - it doesn't work if the text part contains a '>'
870cdf0e10cSrcweir     //sal_uInt16 nTokenEnd = sPattern.Search('>');
871cdf0e10cSrcweir 
872cdf0e10cSrcweir     String aResult;
873cdf0e10cSrcweir 
874cdf0e10cSrcweir     xub_StrLen nEnd = sPattern.Search( '>', nStt );
875cdf0e10cSrcweir     if( STRING_NOTFOUND == nEnd )
876cdf0e10cSrcweir     {
877cdf0e10cSrcweir         nEnd = sPattern.Len();
878cdf0e10cSrcweir     }
879cdf0e10cSrcweir     else
880cdf0e10cSrcweir     {
881cdf0e10cSrcweir         xub_StrLen nTextSeparatorFirst = sPattern.Search( TOX_STYLE_DELIMITER, nStt );
882cdf0e10cSrcweir         if( STRING_NOTFOUND != nTextSeparatorFirst )
883cdf0e10cSrcweir         {
884cdf0e10cSrcweir             xub_StrLen nTextSeparatorSecond = sPattern.Search( TOX_STYLE_DELIMITER,
885cdf0e10cSrcweir                                                                nTextSeparatorFirst + 1 );
886cdf0e10cSrcweir             if( STRING_NOTFOUND != nTextSeparatorSecond &&
887cdf0e10cSrcweir                 nEnd > nTextSeparatorFirst )
888cdf0e10cSrcweir                 nEnd = sPattern.Search( '>', nTextSeparatorSecond );
889cdf0e10cSrcweir         }
890cdf0e10cSrcweir 
891cdf0e10cSrcweir         ++nEnd;
892cdf0e10cSrcweir 
893cdf0e10cSrcweir         aResult = sPattern.Copy( nStt, nEnd - nStt );
894cdf0e10cSrcweir     }
895cdf0e10cSrcweir 
896cdf0e10cSrcweir     return aResult;
897cdf0e10cSrcweir }
898cdf0e10cSrcweir 
GetTokenType(const String & sToken,xub_StrLen * pTokenLen) const899cdf0e10cSrcweir FormTokenType SwFormTokensHelper::GetTokenType(const String & sToken,
900cdf0e10cSrcweir                                                xub_StrLen * pTokenLen) const
901cdf0e10cSrcweir {
902cdf0e10cSrcweir     static struct
903cdf0e10cSrcweir     {
904cdf0e10cSrcweir         const sal_Char* pNm;
905cdf0e10cSrcweir         sal_uInt16 nLen;
906cdf0e10cSrcweir         sal_uInt16 nOffset;
907cdf0e10cSrcweir         FormTokenType eToken;
908cdf0e10cSrcweir     } __READONLY_DATA aTokenArr[] = {
909cdf0e10cSrcweir         { SwForm::aFormTab,       SwForm::nFormEntryLen,      1, TOKEN_TAB_STOP },
910cdf0e10cSrcweir         { SwForm::aFormPageNums,  SwForm::nFormPageNumsLen,   1, TOKEN_PAGE_NUMS },
911cdf0e10cSrcweir         { SwForm::aFormLinkStt,   SwForm::nFormLinkSttLen,    1, TOKEN_LINK_START },
912cdf0e10cSrcweir         { SwForm::aFormLinkEnd,   SwForm::nFormLinkEndLen,    1, TOKEN_LINK_END },
913cdf0e10cSrcweir         { SwForm::aFormEntryNum,  SwForm::nFormEntryNumLen,   1, TOKEN_ENTRY_NO },
914cdf0e10cSrcweir         { SwForm::aFormEntryTxt,  SwForm::nFormEntryTxtLen,   1, TOKEN_ENTRY_TEXT },
915cdf0e10cSrcweir         { SwForm::aFormChapterMark,SwForm::nFormChapterMarkLen,1,TOKEN_CHAPTER_INFO },
916cdf0e10cSrcweir         { SwForm::aFormText,      SwForm::nFormTextLen,       1, TOKEN_TEXT },
917cdf0e10cSrcweir         { SwForm::aFormEntry,     SwForm::nFormEntryLen,      1, TOKEN_ENTRY },
918cdf0e10cSrcweir         { SwForm::aFormAuth,      SwForm::nFormAuthLen,       3, TOKEN_AUTHORITY },
919cdf0e10cSrcweir         { 0,                      0,                          0, TOKEN_END }
920cdf0e10cSrcweir     };
921cdf0e10cSrcweir 
922cdf0e10cSrcweir     FormTokenType eTokenType = TOKEN_TEXT;
923cdf0e10cSrcweir     xub_StrLen nTokenLen = 0;
924cdf0e10cSrcweir     const sal_Char* pNm;
925cdf0e10cSrcweir     for( int i = 0; 0 != ( pNm = aTokenArr[ i ].pNm ); ++i )
926cdf0e10cSrcweir         if( COMPARE_EQUAL == sToken.CompareToAscii( pNm,
927cdf0e10cSrcweir                             aTokenArr[ i ].nLen - aTokenArr[ i ].nOffset ))
928cdf0e10cSrcweir         {
929cdf0e10cSrcweir             eTokenType = aTokenArr[ i ].eToken;
930cdf0e10cSrcweir             nTokenLen = aTokenArr[ i ].nLen;
931cdf0e10cSrcweir             break;
932cdf0e10cSrcweir         }
933cdf0e10cSrcweir 
934cdf0e10cSrcweir     ASSERT( pNm, "wrong token" );
935cdf0e10cSrcweir     if (pTokenLen)
936cdf0e10cSrcweir         *pTokenLen = nTokenLen;
937cdf0e10cSrcweir 
938cdf0e10cSrcweir     return eTokenType;
939cdf0e10cSrcweir }
940cdf0e10cSrcweir 
941cdf0e10cSrcweir // <- #i21237#
942cdf0e10cSrcweir 
SetPattern(sal_uInt16 nLevel,const SwFormTokens & rTokens)943cdf0e10cSrcweir void SwForm::SetPattern(sal_uInt16 nLevel, const SwFormTokens& rTokens)
944cdf0e10cSrcweir {
945cdf0e10cSrcweir 	ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
946cdf0e10cSrcweir 	aPattern[nLevel] = rTokens;
947cdf0e10cSrcweir }
948cdf0e10cSrcweir 
SetPattern(sal_uInt16 nLevel,const String & rStr)949cdf0e10cSrcweir void SwForm::SetPattern(sal_uInt16 nLevel, const String & rStr)
950cdf0e10cSrcweir {
951cdf0e10cSrcweir 	ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
952cdf0e10cSrcweir 
953cdf0e10cSrcweir     SwFormTokensHelper aHelper(rStr);
954cdf0e10cSrcweir 	aPattern[nLevel] = aHelper.GetTokens();
955cdf0e10cSrcweir }
956cdf0e10cSrcweir 
GetPattern(sal_uInt16 nLevel) const957cdf0e10cSrcweir const SwFormTokens& SwForm::GetPattern(sal_uInt16 nLevel) const
958cdf0e10cSrcweir {
959cdf0e10cSrcweir 	ASSERT(nLevel < GetFormMax(), "Index >= FORM_MAX");
960cdf0e10cSrcweir 	return aPattern[nLevel];
961cdf0e10cSrcweir }
962cdf0e10cSrcweir 
963