xref: /aoo41x/main/sw/source/filter/ww8/ww8par5.cxx (revision 2650be22)
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 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <ctype.h>              // tolower
30cdf0e10cSrcweir #include <stdio.h>              // sscanf()
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <sal/types.h>
33cdf0e10cSrcweir #include <tools/solar.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandEnvironment.hpp>
36cdf0e10cSrcweir #include <svl/urihelper.hxx>
37cdf0e10cSrcweir #include <svl/zforlist.hxx>
38cdf0e10cSrcweir #include <svl/zformat.hxx>
39cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #include <ucbhelper/content.hxx>
42cdf0e10cSrcweir #include <ucbhelper/contentbroker.hxx>
43cdf0e10cSrcweir #include <ucbhelper/commandenvironment.hxx>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <com/sun/star/i18n/ScriptType.hdl>
46cdf0e10cSrcweir #include <hintids.hxx>
47cdf0e10cSrcweir #include <editeng/fontitem.hxx>
48cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
49cdf0e10cSrcweir #include <editeng/langitem.hxx>
50cdf0e10cSrcweir #include <fmtfld.hxx>
51cdf0e10cSrcweir #include <fmtanchr.hxx>
52cdf0e10cSrcweir #include <pam.hxx>              // fuer SwPam
53cdf0e10cSrcweir #include <doc.hxx>
54cdf0e10cSrcweir #include <charatr.hxx>          // class SwFmtFld
55cdf0e10cSrcweir #include <flddat.hxx>           // class SwDateTimeField
56cdf0e10cSrcweir #include <docufld.hxx>          // class SwPageNumberField
57cdf0e10cSrcweir #include <reffld.hxx>           // class SwGetRefField
58cdf0e10cSrcweir #include <IMark.hxx>
59cdf0e10cSrcweir #include <expfld.hxx>           // class SwSetExpField
60cdf0e10cSrcweir #include <dbfld.hxx>            // class SwDBField
61cdf0e10cSrcweir #include <usrfld.hxx>
62cdf0e10cSrcweir #include <tox.hxx>
63cdf0e10cSrcweir #include <section.hxx>          // class SwSection
64cdf0e10cSrcweir #include <ndtxt.hxx>
65cdf0e10cSrcweir #include <fmtinfmt.hxx>
66cdf0e10cSrcweir #include <chpfld.hxx>
67cdf0e10cSrcweir #include <ftnidx.hxx>
68cdf0e10cSrcweir #include <txtftn.hxx>
69cdf0e10cSrcweir #include <viewsh.hxx>
70cdf0e10cSrcweir #include <shellres.hxx>
71cdf0e10cSrcweir #include <fmtruby.hxx>
72cdf0e10cSrcweir #include <charfmt.hxx>
73cdf0e10cSrcweir #include <txtatr.hxx>
74cdf0e10cSrcweir #include <breakit.hxx>
75cdf0e10cSrcweir #include <fmtclds.hxx>
76cdf0e10cSrcweir #include <pagedesc.hxx>
77cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
78cdf0e10cSrcweir #include <IMark.hxx>
79cdf0e10cSrcweir 
80cdf0e10cSrcweir #include "ww8scan.hxx"          // WW8FieldDesc
81cdf0e10cSrcweir #include "ww8par.hxx"
82cdf0e10cSrcweir #include "ww8par2.hxx"
83cdf0e10cSrcweir #include "writerhelper.hxx"
84cdf0e10cSrcweir #include "fields.hxx"
85cdf0e10cSrcweir #include <unotools/fltrcfg.hxx>
86cdf0e10cSrcweir 
87cdf0e10cSrcweir #include <algorithm> // #i24377#
88cdf0e10cSrcweir 
89cdf0e10cSrcweir #define MAX_FIELDLEN 64000
90cdf0e10cSrcweir 
91cdf0e10cSrcweir #define WW8_TOX_LEVEL_DELIM     ':'
92cdf0e10cSrcweir 
93cdf0e10cSrcweir using namespace ::com::sun::star;
94cdf0e10cSrcweir using namespace sw::util;
95cdf0e10cSrcweir using namespace sw::mark;
96cdf0e10cSrcweir using namespace std; // #i24377#
97cdf0e10cSrcweir using namespace nsSwDocInfoSubType;
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 
100cdf0e10cSrcweir class _ReadFieldParams
101cdf0e10cSrcweir {
102cdf0e10cSrcweir private:
103cdf0e10cSrcweir     String aData;
104cdf0e10cSrcweir     xub_StrLen nLen, nFnd, nNext, nSavPtr;
105cdf0e10cSrcweir public:
106cdf0e10cSrcweir     _ReadFieldParams( const String& rData );
107cdf0e10cSrcweir     ~_ReadFieldParams();
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     xub_StrLen GoToTokenParam();
110cdf0e10cSrcweir     long SkipToNextToken();
GetTokenSttPtr() const111cdf0e10cSrcweir     xub_StrLen GetTokenSttPtr() const   { return nFnd;  }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     xub_StrLen FindNextStringPiece( xub_StrLen _nStart = STRING_NOTFOUND );
114cdf0e10cSrcweir     bool GetTokenSttFromTo(xub_StrLen* _pFrom, xub_StrLen* _pTo,
115cdf0e10cSrcweir         xub_StrLen _nMax);
116cdf0e10cSrcweir 
117cdf0e10cSrcweir     String GetResult() const;
118cdf0e10cSrcweir };
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 
_ReadFieldParams(const String & _rData)121cdf0e10cSrcweir _ReadFieldParams::_ReadFieldParams( const String& _rData )
122cdf0e10cSrcweir     : aData( _rData ), nLen( _rData.Len() ), nNext( 0 )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     /*
125cdf0e10cSrcweir         erstmal nach einer oeffnenden Klammer oder einer Leerstelle oder einem
126cdf0e10cSrcweir         Anfuehrungszeichen oder einem Backslash suchen, damit der Feldbefehl
127cdf0e10cSrcweir         (also INCLUDEPICTURE bzw EINFUeGENGRAFIK bzw ...) ueberlesen wird
128cdf0e10cSrcweir     */
129cdf0e10cSrcweir     while( (nLen > nNext) && (aData.GetChar( nNext ) == ' ') )
130cdf0e10cSrcweir         ++nNext;
131cdf0e10cSrcweir 
132cdf0e10cSrcweir     sal_Unicode c;
133cdf0e10cSrcweir     while(     nLen > nNext
134cdf0e10cSrcweir             && (c = aData.GetChar( nNext )) != ' '
135cdf0e10cSrcweir             && c != '"'
136cdf0e10cSrcweir             && c != '\\'
137cdf0e10cSrcweir             && c != 132
138cdf0e10cSrcweir             && c != 0x201c )
139cdf0e10cSrcweir         ++nNext;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     nFnd      = nNext;
142cdf0e10cSrcweir     nSavPtr   = nNext;
143cdf0e10cSrcweir //  cLastChar = aData.GetChar( nSavPtr );
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 
~_ReadFieldParams()147cdf0e10cSrcweir _ReadFieldParams::~_ReadFieldParams()
148cdf0e10cSrcweir {
149cdf0e10cSrcweir //  aData.SetChar( nSavPtr, cLastChar );
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 
GetResult() const153cdf0e10cSrcweir String _ReadFieldParams::GetResult() const
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     return    (STRING_NOTFOUND == nFnd)
156cdf0e10cSrcweir             ? aEmptyStr
157cdf0e10cSrcweir             : aData.Copy( nFnd, (nSavPtr - nFnd) );
158cdf0e10cSrcweir }
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 
GoToTokenParam()161cdf0e10cSrcweir xub_StrLen _ReadFieldParams::GoToTokenParam()
162cdf0e10cSrcweir {
163cdf0e10cSrcweir     xub_StrLen nOld = nNext;
164cdf0e10cSrcweir     if( -2 == SkipToNextToken() )
165cdf0e10cSrcweir         return GetTokenSttPtr();
166cdf0e10cSrcweir     nNext = nOld;
167cdf0e10cSrcweir     return STRING_NOTFOUND;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir // ret: -2: NOT a '\' parameter but normal Text
SkipToNextToken()171cdf0e10cSrcweir long _ReadFieldParams::SkipToNextToken()
172cdf0e10cSrcweir {
173cdf0e10cSrcweir     long nRet = -1;     // Ende
174cdf0e10cSrcweir     if (
175cdf0e10cSrcweir          (STRING_NOTFOUND != nNext) && (nLen > nNext) &&
176cdf0e10cSrcweir          STRING_NOTFOUND != (nFnd = FindNextStringPiece(nNext))
177cdf0e10cSrcweir        )
178cdf0e10cSrcweir     {
179cdf0e10cSrcweir         nSavPtr = nNext;
180cdf0e10cSrcweir 
181cdf0e10cSrcweir         if ('\\' == aData.GetChar(nFnd) && '\\' != aData.GetChar(nFnd + 1))
182cdf0e10cSrcweir         {
183cdf0e10cSrcweir             nRet = aData.GetChar(++nFnd);
184cdf0e10cSrcweir             nNext = ++nFnd;             // und dahinter setzen
185cdf0e10cSrcweir         }
186cdf0e10cSrcweir         else
187cdf0e10cSrcweir         {
188cdf0e10cSrcweir             nRet = -2;
189cdf0e10cSrcweir             if (
190cdf0e10cSrcweir                  (STRING_NOTFOUND != nSavPtr ) &&
191cdf0e10cSrcweir                  (
192cdf0e10cSrcweir                    ('"' == aData.GetChar(nSavPtr - 1)) ||
193cdf0e10cSrcweir                    (0x201d == aData.GetChar(nSavPtr - 1))
194cdf0e10cSrcweir                  )
195cdf0e10cSrcweir                )
196cdf0e10cSrcweir             {
197cdf0e10cSrcweir                 --nSavPtr;
198cdf0e10cSrcweir             }
199cdf0e10cSrcweir         }
200cdf0e10cSrcweir     }
201cdf0e10cSrcweir     return nRet;
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir // FindNextPara sucht naechsten Backslash-Parameter oder naechste Zeichenkette
205cdf0e10cSrcweir // bis zum Blank oder naechsten "\" oder zum schliessenden Anfuehrungszeichen
206cdf0e10cSrcweir // oder zum String-Ende von pStr.
207cdf0e10cSrcweir //
208cdf0e10cSrcweir // Ausgabe ppNext (falls ppNext != 0) Suchbeginn fuer naechsten Parameter bzw. 0
209cdf0e10cSrcweir //
210cdf0e10cSrcweir // Returnwert: 0 falls String-Ende erreicht,
211cdf0e10cSrcweir //             ansonsten Anfang des Paramters bzw. der Zeichenkette
212cdf0e10cSrcweir //
FindNextStringPiece(const xub_StrLen nStart)213cdf0e10cSrcweir xub_StrLen _ReadFieldParams::FindNextStringPiece(const xub_StrLen nStart)
214cdf0e10cSrcweir {
215cdf0e10cSrcweir     xub_StrLen  n = ( STRING_NOTFOUND == nStart ) ? nFnd : nStart;  // Anfang
216cdf0e10cSrcweir     xub_StrLen n2;          // Ende
217cdf0e10cSrcweir 
218cdf0e10cSrcweir     nNext = STRING_NOTFOUND;        // Default fuer nicht gefunden
219cdf0e10cSrcweir 
220cdf0e10cSrcweir     while( (nLen > n) && (aData.GetChar( n ) == ' ') )
221cdf0e10cSrcweir         ++n;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     if( nLen == n )
224cdf0e10cSrcweir         return STRING_NOTFOUND;     // String End reached!
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     if(     (aData.GetChar( n ) == '"')     // Anfuehrungszeichen vor Para?
227cdf0e10cSrcweir         ||  (aData.GetChar( n ) == 0x201c)
228cdf0e10cSrcweir         ||  (aData.GetChar( n ) == 132) )
229cdf0e10cSrcweir     {
230cdf0e10cSrcweir         n++;                        // Anfuehrungszeichen ueberlesen
231cdf0e10cSrcweir         n2 = n;                     // ab hier nach Ende suchen
232cdf0e10cSrcweir         while(     (nLen > n2)
233cdf0e10cSrcweir                 && (aData.GetChar( n2 ) != '"')
234cdf0e10cSrcweir                 && (aData.GetChar( n2 ) != 0x201d)
235cdf0e10cSrcweir                 && (aData.GetChar( n2 ) != 147) )
236cdf0e10cSrcweir             n2++;                   // Ende d. Paras suchen
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir     else                        // keine Anfuehrungszeichen
239cdf0e10cSrcweir     {
240cdf0e10cSrcweir         n2 = n;                     // ab hier nach Ende suchen
241cdf0e10cSrcweir         while( (nLen > n2) && (aData.GetChar( n2 ) != ' ') ) // Ende d. Paras suchen
242cdf0e10cSrcweir         {
243cdf0e10cSrcweir             if( aData.GetChar( n2 ) == '\\' )
244cdf0e10cSrcweir             {
245cdf0e10cSrcweir                 if( aData.GetChar( n2+1 ) == '\\' )
246cdf0e10cSrcweir                     n2 += 2;        // Doppel-Backslash -> OK
247cdf0e10cSrcweir                 else
248cdf0e10cSrcweir                 {
249cdf0e10cSrcweir                     if( n2 > n )
250cdf0e10cSrcweir                         n2--;
251cdf0e10cSrcweir                     break;          // einfach-Backslash -> Ende
252cdf0e10cSrcweir                 }
253cdf0e10cSrcweir             }
254cdf0e10cSrcweir             else
255cdf0e10cSrcweir                 n2++;               // kein Backslash -> OK
256cdf0e10cSrcweir         }
257cdf0e10cSrcweir     }
258cdf0e10cSrcweir     if( nLen > n2 )
259cdf0e10cSrcweir     {
260cdf0e10cSrcweir         if(aData.GetChar( n2 ) != ' ') n2++;
261cdf0e10cSrcweir         nNext = n2;
262cdf0e10cSrcweir     }
263cdf0e10cSrcweir     return n;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 
267cdf0e10cSrcweir 
268cdf0e10cSrcweir // read parameters "1-3" or 1-3 with both values between 1 and nMax
GetTokenSttFromTo(sal_uInt16 * pFrom,sal_uInt16 * pTo,sal_uInt16 nMax)269cdf0e10cSrcweir bool _ReadFieldParams::GetTokenSttFromTo(sal_uInt16* pFrom, sal_uInt16* pTo, sal_uInt16 nMax)
270cdf0e10cSrcweir {
271cdf0e10cSrcweir     sal_uInt16 nStart = 0;
272cdf0e10cSrcweir     sal_uInt16 nEnd   = 0;
273cdf0e10cSrcweir     xub_StrLen n = GoToTokenParam();
274cdf0e10cSrcweir     if( STRING_NOTFOUND != n )
275cdf0e10cSrcweir     {
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         String sParams( GetResult() );
278cdf0e10cSrcweir 
279cdf0e10cSrcweir         xub_StrLen nIndex = 0;
280cdf0e10cSrcweir         String sStart( sParams.GetToken(0, '-', nIndex) );
281cdf0e10cSrcweir         if( STRING_NOTFOUND != nIndex )
282cdf0e10cSrcweir         {
283cdf0e10cSrcweir             nStart = static_cast<sal_uInt16>(sStart.ToInt32());
284cdf0e10cSrcweir             nEnd   = static_cast<sal_uInt16>(sParams.Copy(nIndex).ToInt32());
285cdf0e10cSrcweir         }
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir     if( pFrom ) *pFrom = nStart;
288cdf0e10cSrcweir     if( pTo )   *pTo   = nEnd;
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     return nStart && nEnd && (nMax >= nStart) && (nMax >= nEnd);
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir //----------------------------------------
294cdf0e10cSrcweir //              Bookmarks
295cdf0e10cSrcweir //----------------------------------------
296cdf0e10cSrcweir 
2973078b051SOliver-Rainer Wittmann namespace
2983078b051SOliver-Rainer Wittmann {
2993078b051SOliver-Rainer Wittmann     // #120879# - helper method to identify a bookmark name to match the internal TOC bookmark naming convention
IsTOCBookmarkName(const::rtl::OUString & rName)3003078b051SOliver-Rainer Wittmann     bool IsTOCBookmarkName( const ::rtl::OUString& rName )
3013078b051SOliver-Rainer Wittmann     {
3023078b051SOliver-Rainer Wittmann         static const ::rtl::OUString cTOCBookmarkNamePrefix = ::rtl::OUString::createFromAscii("_Toc");
3033078b051SOliver-Rainer Wittmann 
3043078b051SOliver-Rainer Wittmann         return rName.match(cTOCBookmarkNamePrefix);
3053078b051SOliver-Rainer Wittmann     }
3063078b051SOliver-Rainer Wittmann }
3073078b051SOliver-Rainer Wittmann 
Read_Book(WW8PLCFManResult *)308cdf0e10cSrcweir long SwWW8ImplReader::Read_Book(WW8PLCFManResult*)
309cdf0e10cSrcweir {
310cdf0e10cSrcweir     // muesste auch ueber pRes.nCo2OrIdx gehen
311cdf0e10cSrcweir     WW8PLCFx_Book* pB = pPlcxMan->GetBook();
312cdf0e10cSrcweir     if( !pB )
313cdf0e10cSrcweir     {
314cdf0e10cSrcweir         ASSERT( pB, "WW8PLCFx_Book - Pointer nicht da" );
315cdf0e10cSrcweir         return 0;
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir     eBookStatus eB = pB->GetStatus();
319cdf0e10cSrcweir     if (eB & BOOK_IGNORE)
320cdf0e10cSrcweir         return 0;                               // Bookmark zu ignorieren
321cdf0e10cSrcweir 
322cdf0e10cSrcweir     if (pB->GetIsEnd())
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         pReffedStck->SetAttr(*pPaM->GetPoint(), RES_FLTR_BOOKMARK, true,
325cdf0e10cSrcweir             pB->GetHandle(), (eB & BOOK_FIELD)!=0);
326cdf0e10cSrcweir         return 0;
327cdf0e10cSrcweir     }
328cdf0e10cSrcweir 
329f66c5aafSOliver-Rainer Wittmann     // "_Hlt*" are unnecessary
330cdf0e10cSrcweir     const String* pName = pB->GetName();
331f66c5aafSOliver-Rainer Wittmann     // Now, as we read the TOC field completely, we also need the hyperlinks inside keep available.
332f66c5aafSOliver-Rainer Wittmann     // So the hidden bookmarks inside for hyperlink jumping also should be kept.
333f66c5aafSOliver-Rainer Wittmann     if ( !pName ||
334f66c5aafSOliver-Rainer Wittmann          pName->EqualsIgnoreCaseAscii( "_Hlt", 0, 4 ) )
335f66c5aafSOliver-Rainer Wittmann     {
336cdf0e10cSrcweir         return 0;
337f66c5aafSOliver-Rainer Wittmann     }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir     //JP 16.11.98: ToUpper darf auf keinen Fall gemacht werden, weil der
340cdf0e10cSrcweir     //Bookmark- name ein Hyperlink-Ziel sein kann!
341cdf0e10cSrcweir 
342cdf0e10cSrcweir     String aVal;
343cdf0e10cSrcweir     if( SwFltGetFlag( nFieldFlags, SwFltControlStack::BOOK_TO_VAR_REF ) )
344cdf0e10cSrcweir     {
345cdf0e10cSrcweir         // Fuer UEbersetzung Bookmark -> Variable setzen
346cdf0e10cSrcweir         long nLen = pB->GetLen();
347cdf0e10cSrcweir         if( nLen > MAX_FIELDLEN )
348cdf0e10cSrcweir             nLen = MAX_FIELDLEN;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir         long nOldPos = pStrm->Tell();
351cdf0e10cSrcweir         nLen = pSBase->WW8ReadString( *pStrm, aVal, pB->GetStartPos(), nLen,
352cdf0e10cSrcweir                                         eStructCharSet );
353cdf0e10cSrcweir         pStrm->Seek( nOldPos );
354cdf0e10cSrcweir 
355cdf0e10cSrcweir         // JP 19.03.2001 - now here the implementation of the old
356cdf0e10cSrcweir         //              "QuoteString" and I hope with a better performance
357cdf0e10cSrcweir         //              as before. It's also only needed if the filterflags
358cdf0e10cSrcweir         //              say we will convert bookmarks to SetExpFields! And
359cdf0e10cSrcweir         //              this the exception!
360cdf0e10cSrcweir 
361cdf0e10cSrcweir         String sHex(CREATE_CONST_ASC( "\\x" ));
362cdf0e10cSrcweir         bool bSetAsHex;
363cdf0e10cSrcweir         bool bAllowCr = SwFltGetFlag(nFieldFlags,
364cdf0e10cSrcweir             SwFltControlStack::ALLOW_FLD_CR) ? true : false;
365cdf0e10cSrcweir 
366cdf0e10cSrcweir         sal_Unicode cChar;
367cdf0e10cSrcweir 
368cdf0e10cSrcweir         for( xub_StrLen nI = 0;
369cdf0e10cSrcweir                 nI < aVal.Len() && aVal.Len() < (MAX_FIELDLEN - 4); ++nI )
370cdf0e10cSrcweir         {
371cdf0e10cSrcweir             switch( cChar = aVal.GetChar( nI ) )
372cdf0e10cSrcweir             {
373cdf0e10cSrcweir             case 0x0b:
374cdf0e10cSrcweir             case 0x0c:
375cdf0e10cSrcweir             case 0x0d:
376cdf0e10cSrcweir                 if( bAllowCr )
377cdf0e10cSrcweir                     aVal.SetChar( nI, '\n' ), bSetAsHex = false;
378cdf0e10cSrcweir                 else
379cdf0e10cSrcweir                     bSetAsHex = true;
380cdf0e10cSrcweir                 break;
381cdf0e10cSrcweir 
382cdf0e10cSrcweir             case 0xFE:
383cdf0e10cSrcweir             case 0xFF:
384cdf0e10cSrcweir                 bSetAsHex = true;
385cdf0e10cSrcweir                 break;
386cdf0e10cSrcweir 
387cdf0e10cSrcweir             default:
388cdf0e10cSrcweir                 bSetAsHex = 0x20 > cChar;
389cdf0e10cSrcweir                 break;
390cdf0e10cSrcweir             }
391cdf0e10cSrcweir 
392cdf0e10cSrcweir             if( bSetAsHex )
393cdf0e10cSrcweir             {
394cdf0e10cSrcweir                 //all Hex-Numbers with \x before
395cdf0e10cSrcweir                 String sTmp( sHex );
396cdf0e10cSrcweir                 if( cChar < 0x10 )
397cdf0e10cSrcweir                     sTmp += '0';
398cdf0e10cSrcweir                 sTmp += String::CreateFromInt32( cChar, 16 );
399cdf0e10cSrcweir                 aVal.Replace( nI, 1 , sTmp );
400cdf0e10cSrcweir                 nI += sTmp.Len() - 1;
401cdf0e10cSrcweir             }
402cdf0e10cSrcweir         }
403cdf0e10cSrcweir 
404cdf0e10cSrcweir         if( aVal.Len() > (MAX_FIELDLEN - 4))
405cdf0e10cSrcweir             aVal.Erase( MAX_FIELDLEN - 4 );
406cdf0e10cSrcweir     }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     //e.g. inserting bookmark around field result, so we need to put
409cdf0e10cSrcweir     //it around the entire writer field, as we don't have the seperation
410cdf0e10cSrcweir     //of field and field result of word, see #i16941#
411cdf0e10cSrcweir     SwPosition aStart(*pPaM->GetPoint());
412cdf0e10cSrcweir     if (!maFieldStack.empty())
413cdf0e10cSrcweir     {
414cdf0e10cSrcweir         const FieldEntry &rTest = maFieldStack.back();
415cdf0e10cSrcweir         aStart = rTest.maStartPos;
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir 
4183078b051SOliver-Rainer Wittmann     const String sOrigName = BookmarkToWriter(*pName);
4193078b051SOliver-Rainer Wittmann     pReffedStck->NewAttr( aStart,
4203078b051SOliver-Rainer Wittmann                           SwFltBookmark( sOrigName, aVal, pB->GetHandle(), IsTOCBookmarkName( sOrigName ) ));
421cdf0e10cSrcweir     return 0;
422cdf0e10cSrcweir }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir //----------------------------------------------------------------------
425cdf0e10cSrcweir //    allgemeine Hilfsroutinen zum Auseinanderdroeseln der Parameter
426cdf0e10cSrcweir //----------------------------------------------------------------------
427cdf0e10cSrcweir 
428cdf0e10cSrcweir // ConvertFFileName uebersetzt FeldParameter-Namen u. ae. in den
429cdf0e10cSrcweir // System-Zeichensatz.
430cdf0e10cSrcweir // Gleichzeitig werden doppelte Backslashes in einzelne uebersetzt.
ConvertFFileName(String & rName,const String & rOrg)431cdf0e10cSrcweir void SwWW8ImplReader::ConvertFFileName( String& rName, const String& rOrg )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     rName = rOrg;
434cdf0e10cSrcweir     rName.SearchAndReplaceAllAscii( "\\\\", String( '\\' ));
435cdf0e10cSrcweir     rName.SearchAndReplaceAllAscii( "%20", String( ' ' ));
436cdf0e10cSrcweir 
437cdf0e10cSrcweir     // ggfs. anhaengende Anfuehrungszeichen entfernen
438cdf0e10cSrcweir     if( rName.Len() &&  '"' == rName.GetChar( rName.Len()-1 ))
439cdf0e10cSrcweir         rName.Erase( rName.Len()-1, 1);
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     //#82900# Need the more sophisticated url converter. cmc
442cdf0e10cSrcweir     if (rName.Len())
443cdf0e10cSrcweir         rName = URIHelper::SmartRel2Abs(
444cdf0e10cSrcweir             INetURLObject(sBaseURL), rName, Link(), false);
445cdf0e10cSrcweir }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir // ConvertUFNneme uebersetzt FeldParameter-Namen u. ae. in den
448cdf0e10cSrcweir // System-Zeichensatz und Upcased sie ( z.B. fuer Ref-Felder )
449cdf0e10cSrcweir namespace
450cdf0e10cSrcweir {
ConvertUFName(String & rName)451cdf0e10cSrcweir     void ConvertUFName( String& rName )
452cdf0e10cSrcweir     {
453cdf0e10cSrcweir         GetAppCharClass().toUpper( rName );
454cdf0e10cSrcweir     }
455cdf0e10cSrcweir }
456cdf0e10cSrcweir 
lcl_ConvertSequenceName(String & rSequenceName)457cdf0e10cSrcweir static void lcl_ConvertSequenceName(String& rSequenceName)
458cdf0e10cSrcweir {
459cdf0e10cSrcweir     ConvertUFName(rSequenceName);
460cdf0e10cSrcweir     if ('0' <= rSequenceName.GetChar(0) && '9' >= rSequenceName.GetChar(0))
461cdf0e10cSrcweir         rSequenceName.Insert('_', 0);
462cdf0e10cSrcweir }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir // FindParaStart() finds 1st Parameter that follows '\' and cToken
465cdf0e10cSrcweir // and returns start of this parameter or STRING_NOT_FOUND.
FindParaStart(const String & rStr,sal_Unicode cToken,sal_Unicode cToken2)466cdf0e10cSrcweir xub_StrLen FindParaStart( const String& rStr, sal_Unicode cToken, sal_Unicode cToken2 )
467cdf0e10cSrcweir {
468cdf0e10cSrcweir     bool bStr = false;          // innerhalb String ignorieren
469cdf0e10cSrcweir 
470cdf0e10cSrcweir     for( xub_StrLen nBuf=0; nBuf+1 < rStr.Len(); nBuf++ )
471cdf0e10cSrcweir     {
472cdf0e10cSrcweir         if( rStr.GetChar( nBuf ) == '"' )
473cdf0e10cSrcweir             bStr = !bStr;
474cdf0e10cSrcweir 
475cdf0e10cSrcweir         if(    !bStr
476cdf0e10cSrcweir             && rStr.GetChar( nBuf ) == '\\'
477cdf0e10cSrcweir             && (    rStr.GetChar( nBuf + 1 ) == cToken
478cdf0e10cSrcweir                  || rStr.GetChar( nBuf + 1 ) == cToken2 ) )
479cdf0e10cSrcweir         {
480cdf0e10cSrcweir             nBuf += 2;
481cdf0e10cSrcweir             // skip spaces between cToken and it's parameters
482cdf0e10cSrcweir             while(    nBuf < rStr.Len()
483cdf0e10cSrcweir                    && rStr.GetChar( nBuf ) == ' ' )
484cdf0e10cSrcweir                 nBuf++;
485cdf0e10cSrcweir             // return start of parameters
486cdf0e10cSrcweir             return nBuf < rStr.Len() ? nBuf : STRING_NOTFOUND;
487cdf0e10cSrcweir         }
488cdf0e10cSrcweir     }
489cdf0e10cSrcweir     return STRING_NOTFOUND;
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir // FindPara() findet den ersten Parameter mit '\' und cToken. Es wird
493cdf0e10cSrcweir // ein neuer String allokiert ( der vom Aufrufer deallokiert werden muss )
494cdf0e10cSrcweir // und alles, was zum Parameter gehoert, wird in ihm zurueckgeliefert.
FindPara(const String & rStr,sal_Unicode cToken,sal_Unicode cToken2)495cdf0e10cSrcweir String FindPara( const String& rStr, sal_Unicode cToken, sal_Unicode cToken2 )
496cdf0e10cSrcweir {
497cdf0e10cSrcweir     xub_StrLen n2;                                          // Ende
498cdf0e10cSrcweir     xub_StrLen n = FindParaStart( rStr, cToken, cToken2 );  // Anfang
499cdf0e10cSrcweir     if( STRING_NOTFOUND == n )
500cdf0e10cSrcweir         return aEmptyStr;
501cdf0e10cSrcweir 
502cdf0e10cSrcweir     if(    rStr.GetChar( n ) == '"'
503cdf0e10cSrcweir         || rStr.GetChar( n ) == 132 )
504cdf0e10cSrcweir     {                               // Anfuehrungszeichen vor Para
505cdf0e10cSrcweir         n++;                        // Anfuehrungszeichen ueberlesen
506cdf0e10cSrcweir         n2 = n;                     // ab hier nach Ende suchen
507cdf0e10cSrcweir         while(     n2 < rStr.Len()
508cdf0e10cSrcweir                 && rStr.GetChar( n2 ) != 147
509cdf0e10cSrcweir                 && rStr.GetChar( n2 ) != '"' )
510cdf0e10cSrcweir             n2++;                   // Ende d. Paras suchen
511cdf0e10cSrcweir     }
512cdf0e10cSrcweir     else
513cdf0e10cSrcweir     {                           // keine Anfuehrungszeichen
514cdf0e10cSrcweir         n2 = n;                     // ab hier nach Ende suchen
515cdf0e10cSrcweir         while(     n2 < rStr.Len()
516cdf0e10cSrcweir                 && rStr.GetChar( n2 ) != ' ' )
517cdf0e10cSrcweir             n2++;                   // Ende d. Paras suchen
518cdf0e10cSrcweir     }
519cdf0e10cSrcweir     return rStr.Copy( n, n2-n );
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 
GetNumTypeFromName(const String & rStr,bool bAllowPageDesc=false)523cdf0e10cSrcweir static SvxExtNumType GetNumTypeFromName(const String& rStr,
524cdf0e10cSrcweir     bool bAllowPageDesc = false)
525cdf0e10cSrcweir {
526cdf0e10cSrcweir     SvxExtNumType eTyp = bAllowPageDesc ? SVX_NUM_PAGEDESC : SVX_NUM_ARABIC;
527cdf0e10cSrcweir     if( rStr.EqualsIgnoreCaseAscii( "Arabi", 0, 5 ) )  // Arabisch, Arabic
528cdf0e10cSrcweir         eTyp = SVX_NUM_ARABIC;
529cdf0e10cSrcweir     else if( rStr.EqualsAscii( "misch", 2, 5 ) )    // r"omisch
530cdf0e10cSrcweir         eTyp = SVX_NUM_ROMAN_LOWER;
531cdf0e10cSrcweir     else if( rStr.EqualsAscii( "MISCH", 2, 5 ) )    // R"OMISCH
532cdf0e10cSrcweir         eTyp = SVX_NUM_ROMAN_UPPER;
533cdf0e10cSrcweir     else if( rStr.EqualsIgnoreCaseAscii( "alphabeti", 0, 9 ) )// alphabetisch, alphabetic
534cdf0e10cSrcweir         eTyp =  ( rStr.GetChar( 0 ) == 'A' )
535cdf0e10cSrcweir                 ? SVX_NUM_CHARS_UPPER_LETTER_N
536cdf0e10cSrcweir                 : SVX_NUM_CHARS_LOWER_LETTER_N;
537cdf0e10cSrcweir     else if( rStr.EqualsIgnoreCaseAscii( "roman", 0, 5 ) )  // us
538cdf0e10cSrcweir         eTyp =  ( rStr.GetChar( 0 ) == 'R' )
539cdf0e10cSrcweir                 ? SVX_NUM_ROMAN_UPPER
540cdf0e10cSrcweir                 : SVX_NUM_ROMAN_LOWER;
541cdf0e10cSrcweir     return eTyp;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
GetNumberPara(String & rStr,bool bAllowPageDesc=false)544cdf0e10cSrcweir static SvxExtNumType GetNumberPara(String& rStr, bool bAllowPageDesc = false)
545cdf0e10cSrcweir {
546cdf0e10cSrcweir     String s( FindPara( rStr, '*', '*' ) );     // Ziffernart
547cdf0e10cSrcweir     SvxExtNumType aType = GetNumTypeFromName( s, bAllowPageDesc );
548cdf0e10cSrcweir     return aType;
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 
ForceFieldLanguage(SwField & rFld,sal_uInt16 nLang)554cdf0e10cSrcweir bool SwWW8ImplReader::ForceFieldLanguage(SwField &rFld, sal_uInt16 nLang)
555cdf0e10cSrcweir {
556cdf0e10cSrcweir     bool bRet(false);
557cdf0e10cSrcweir 
558cdf0e10cSrcweir     const SvxLanguageItem *pLang =
559cdf0e10cSrcweir         (const SvxLanguageItem*)GetFmtAttr(RES_CHRATR_LANGUAGE);
560cdf0e10cSrcweir     ASSERT(pLang, "impossible");
561cdf0e10cSrcweir     sal_uInt16 nDefault =  pLang ? pLang->GetValue() : LANGUAGE_ENGLISH_US;
562cdf0e10cSrcweir 
563cdf0e10cSrcweir     if (nLang != nDefault)
564cdf0e10cSrcweir     {
565cdf0e10cSrcweir         rFld.SetAutomaticLanguage(false);
566cdf0e10cSrcweir         rFld.SetLanguage(nLang);
567cdf0e10cSrcweir         bRet = true;
568cdf0e10cSrcweir     }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir     return bRet;
571cdf0e10cSrcweir }
572cdf0e10cSrcweir 
GetWordDefaultDateStringAsUS(SvNumberFormatter * pFormatter,sal_uInt16 nLang)573cdf0e10cSrcweir String GetWordDefaultDateStringAsUS(SvNumberFormatter* pFormatter, sal_uInt16 nLang)
574cdf0e10cSrcweir {
575cdf0e10cSrcweir     //Get the system date in the correct final language layout, convert to
576cdf0e10cSrcweir     //a known language and modify the 2 digit year part to be 4 digit, and
577cdf0e10cSrcweir     //convert back to the correct language layout.
578cdf0e10cSrcweir     sal_uLong nIndex = pFormatter->GetFormatIndex(NF_DATE_SYSTEM_SHORT, nLang);
579cdf0e10cSrcweir 
580cdf0e10cSrcweir     SvNumberformat aFormat = const_cast<SvNumberformat &>
581cdf0e10cSrcweir         (*(pFormatter->GetEntry(nIndex)));
582cdf0e10cSrcweir     aFormat.ConvertLanguage(*pFormatter, nLang, LANGUAGE_ENGLISH_US);
583cdf0e10cSrcweir 
584cdf0e10cSrcweir     String sParams(aFormat.GetFormatstring());
585cdf0e10cSrcweir     // --> OD 2007-02-09 #i36594#
586cdf0e10cSrcweir     // Fix provided by mloiseleur@openoffice.org.
587cdf0e10cSrcweir     // A default date can have already 4 year digits, in some case
588cdf0e10cSrcweir     const xub_StrLen pos = sParams.Search( CREATE_CONST_ASC("YYYY") );
589cdf0e10cSrcweir     if ( pos == STRING_NOTFOUND )
590cdf0e10cSrcweir     {
591cdf0e10cSrcweir         sParams.SearchAndReplace(CREATE_CONST_ASC("YY"), CREATE_CONST_ASC("YYYY"));
592cdf0e10cSrcweir     }
593cdf0e10cSrcweir     // <--
594cdf0e10cSrcweir     return sParams;
595cdf0e10cSrcweir }
596cdf0e10cSrcweir 
GetTimeDatePara(String & rStr,sal_uInt32 & rFormat,sal_uInt16 & rLang,int nWhichDefault,bool bHijri)597cdf0e10cSrcweir short SwWW8ImplReader::GetTimeDatePara(String& rStr, sal_uInt32& rFormat,
598cdf0e10cSrcweir     sal_uInt16 &rLang, int nWhichDefault, bool bHijri)
599cdf0e10cSrcweir {
600cdf0e10cSrcweir     bool bRTL = false;
601cdf0e10cSrcweir     if (pPlcxMan && !bVer67)
602cdf0e10cSrcweir     {
603cdf0e10cSrcweir         const sal_uInt8 *pResult = pPlcxMan->HasCharSprm(0x85A);
604cdf0e10cSrcweir         if (pResult && *pResult)
605cdf0e10cSrcweir             bRTL = true;
606cdf0e10cSrcweir     }
607cdf0e10cSrcweir     RES_CHRATR eLang = bRTL ? RES_CHRATR_CTL_LANGUAGE : RES_CHRATR_LANGUAGE;
608cdf0e10cSrcweir     const SvxLanguageItem *pLang = (SvxLanguageItem*)GetFmtAttr( static_cast< sal_uInt16 >(eLang));
609cdf0e10cSrcweir     ASSERT(pLang, "impossible");
610cdf0e10cSrcweir     rLang = pLang ? pLang->GetValue() : LANGUAGE_ENGLISH_US;
611cdf0e10cSrcweir 
612cdf0e10cSrcweir     SvNumberFormatter* pFormatter = rDoc.GetNumberFormatter();
613cdf0e10cSrcweir     String sParams( FindPara( rStr, '@', '@' ) );// Date/Time
614cdf0e10cSrcweir     if (!sParams.Len())
615cdf0e10cSrcweir     {
616cdf0e10cSrcweir         bool bHasTime = false;
617cdf0e10cSrcweir         switch (nWhichDefault)
618cdf0e10cSrcweir         {
619cdf0e10cSrcweir             case ww::ePRINTDATE:
620cdf0e10cSrcweir             case ww::eSAVEDATE:
621cdf0e10cSrcweir                 sParams = GetWordDefaultDateStringAsUS(pFormatter, rLang);
622cdf0e10cSrcweir                 sParams.APPEND_CONST_ASC(" HH:MM:SS AM/PM");
623cdf0e10cSrcweir                 bHasTime = true;
624cdf0e10cSrcweir                 break;
625cdf0e10cSrcweir             case ww::eCREATEDATE:
626cdf0e10cSrcweir                 sParams.ASSIGN_CONST_ASC("DD/MM/YYYY HH:MM:SS");
627cdf0e10cSrcweir                 bHasTime = true;
628cdf0e10cSrcweir                 break;
629cdf0e10cSrcweir             default:
630cdf0e10cSrcweir             case ww::eDATE:
631cdf0e10cSrcweir                 sParams = GetWordDefaultDateStringAsUS(pFormatter, rLang);
632cdf0e10cSrcweir                 break;
633cdf0e10cSrcweir         }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir         if (bHijri)
636cdf0e10cSrcweir             sParams.Insert(CREATE_CONST_ASC("[~hijri]"), 0);
637cdf0e10cSrcweir 
638cdf0e10cSrcweir         sal_uInt16 nCheckPos = 0;
639cdf0e10cSrcweir         sal_Int16 nType = NUMBERFORMAT_DEFINED;
640cdf0e10cSrcweir         rFormat = 0;
641cdf0e10cSrcweir 
642cdf0e10cSrcweir         pFormatter->PutandConvertEntry(sParams, nCheckPos, nType, rFormat,
643cdf0e10cSrcweir             LANGUAGE_ENGLISH_US, rLang);
644cdf0e10cSrcweir 
645cdf0e10cSrcweir         return bHasTime ? NUMBERFORMAT_DATETIME : NUMBERFORMAT_DATE;
646cdf0e10cSrcweir     }
647cdf0e10cSrcweir 
648cdf0e10cSrcweir     sal_uLong nFmtIdx =
649cdf0e10cSrcweir         sw::ms::MSDateTimeFormatToSwFormat(sParams, pFormatter, rLang, bHijri);
650cdf0e10cSrcweir     short nNumFmtType = NUMBERFORMAT_UNDEFINED;
651cdf0e10cSrcweir     if (nFmtIdx)
652cdf0e10cSrcweir         nNumFmtType = pFormatter->GetType(nFmtIdx);
653cdf0e10cSrcweir     rFormat = nFmtIdx;
654cdf0e10cSrcweir 
655cdf0e10cSrcweir     return nNumFmtType;
656cdf0e10cSrcweir }
657cdf0e10cSrcweir 
658cdf0e10cSrcweir //-----------------------------------------
659cdf0e10cSrcweir //              Felder
660cdf0e10cSrcweir //-----------------------------------------
661cdf0e10cSrcweir // Am Ende des Einlesens entsprechende Felder updaten ( z.Zt. die Referenzen )
UpdateFields()662cdf0e10cSrcweir void SwWW8ImplReader::UpdateFields()
663cdf0e10cSrcweir {
664cdf0e10cSrcweir //  rDoc.GetSysFldType( RES_GETREFFLD )->UpdateFlds();  // Referenzen
665cdf0e10cSrcweir //  rDoc.UpdateFlds();                                  // SetExp-Fields
666cdf0e10cSrcweir //  rDoc.UpdateFlds();              // alles ???
667cdf0e10cSrcweir //  rDoc.UpdateExpFlds();                               // SetExp-Fields
668cdf0e10cSrcweir     rDoc.SetUpdateExpFldStat(true);                 // JP: neu fuer alles wichtige
669cdf0e10cSrcweir     rDoc.SetInitDBFields(true);             // Datenbank-Felder auch
670cdf0e10cSrcweir }
671cdf0e10cSrcweir 
End_Field()672cdf0e10cSrcweir sal_uInt16 SwWW8ImplReader::End_Field()
673cdf0e10cSrcweir {
674cdf0e10cSrcweir     sal_uInt16 nRet = 0;
675cdf0e10cSrcweir     WW8PLCFx_FLD* pF = pPlcxMan->GetFld();
676cdf0e10cSrcweir     ASSERT(pF, "WW8PLCFx_FLD - Pointer nicht da");
677f66c5aafSOliver-Rainer Wittmann     WW8_CP nCP = 0;
678f66c5aafSOliver-Rainer Wittmann     if (!pF || !pF->EndPosIsFieldEnd(nCP))
679cdf0e10cSrcweir         return nRet;
680cdf0e10cSrcweir 
681cdf0e10cSrcweir     const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
682cdf0e10cSrcweir     sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
683cdf0e10cSrcweir 
684cdf0e10cSrcweir     ASSERT(!maFieldStack.empty(), "Empty field stack\n");
685cdf0e10cSrcweir     if (!maFieldStack.empty())
686cdf0e10cSrcweir     {
687cdf0e10cSrcweir         /*
688cdf0e10cSrcweir         only hyperlinks currently need to be handled like this, for the other
689cdf0e10cSrcweir         cases we have inserted a field not an attribute with an unknown end
690cdf0e10cSrcweir         point
691cdf0e10cSrcweir         */
692cdf0e10cSrcweir         nRet = maFieldStack.back().mnFieldId;
693cdf0e10cSrcweir         switch (nRet)
694cdf0e10cSrcweir         {
695cdf0e10cSrcweir         case 70:
696cdf0e10cSrcweir         if (bUseEnhFields && pPaM!=NULL && pPaM->GetPoint()!=NULL) {
697cdf0e10cSrcweir             SwPosition aEndPos = *pPaM->GetPoint();
698cdf0e10cSrcweir             SwPaM aFldPam( maFieldStack.back().GetPtNode(), maFieldStack.back().GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
699cdf0e10cSrcweir             IDocumentMarkAccess* pMarksAccess = rDoc.getIDocumentMarkAccess( );
700cdf0e10cSrcweir             IFieldmark *pFieldmark = dynamic_cast<IFieldmark*>( pMarksAccess->makeFieldBookmark(
701cdf0e10cSrcweir                         aFldPam, maFieldStack.back().GetBookmarkName(), ::rtl::OUString::createFromAscii(ODF_FORMTEXT ) ) );
702cdf0e10cSrcweir             ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
703cdf0e10cSrcweir             if (pFieldmark!=NULL) {
704cdf0e10cSrcweir                 const IFieldmark::parameter_map_t& pParametersToAdd = maFieldStack.back().getParameters();
705cdf0e10cSrcweir                 pFieldmark->GetParameters()->insert(pParametersToAdd.begin(), pParametersToAdd.end());
706cdf0e10cSrcweir             }
707cdf0e10cSrcweir         }
708cdf0e10cSrcweir         break;
709f66c5aafSOliver-Rainer Wittmann             // Doing corresponding status management for TOC field, index field, hyperlink field and page reference field
710f66c5aafSOliver-Rainer Wittmann             case 13://TOX
711f66c5aafSOliver-Rainer Wittmann             case 8://index
712f66c5aafSOliver-Rainer Wittmann                 if (mbLoadingTOCCache)
713f66c5aafSOliver-Rainer Wittmann                 {
714f66c5aafSOliver-Rainer Wittmann                     maTOXEndCps.insert(nCP);
715f66c5aafSOliver-Rainer Wittmann                     mbLoadingTOCCache = false;
716f66c5aafSOliver-Rainer Wittmann                     if ( pPaM->End() &&
717f66c5aafSOliver-Rainer Wittmann                          pPaM->End()->nNode.GetNode().GetTxtNode() &&
718f66c5aafSOliver-Rainer Wittmann                          pPaM->End()->nNode.GetNode().GetTxtNode()->Len() == 0 )
719f66c5aafSOliver-Rainer Wittmann                     {
720f66c5aafSOliver-Rainer Wittmann                             JoinNode(*pPaM);
721f66c5aafSOliver-Rainer Wittmann                     }
722f66c5aafSOliver-Rainer Wittmann                     else
723f66c5aafSOliver-Rainer Wittmann                     {
724f66c5aafSOliver-Rainer Wittmann                             mbCareLastParaEndInToc = true;
725f66c5aafSOliver-Rainer Wittmann                     }
726f66c5aafSOliver-Rainer Wittmann 
727f66c5aafSOliver-Rainer Wittmann                     if (mpPosAfterTOC)
728f66c5aafSOliver-Rainer Wittmann                     {
729f66c5aafSOliver-Rainer Wittmann                         *pPaM = *mpPosAfterTOC;
730f66c5aafSOliver-Rainer Wittmann                         delete mpPosAfterTOC;
731f66c5aafSOliver-Rainer Wittmann                         mpPosAfterTOC = 0;
732f66c5aafSOliver-Rainer Wittmann                     }
733f66c5aafSOliver-Rainer Wittmann                 }
734f66c5aafSOliver-Rainer Wittmann                 break;
735f66c5aafSOliver-Rainer Wittmann             case 37://REF
736f66c5aafSOliver-Rainer Wittmann                 if (mbLoadingTOCCache && !mbLoadingTOCHyperlink)
737f66c5aafSOliver-Rainer Wittmann                 {
738f66c5aafSOliver-Rainer Wittmann                     pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT);
739f66c5aafSOliver-Rainer Wittmann                 }
740f66c5aafSOliver-Rainer Wittmann                 break;
741cdf0e10cSrcweir             case 88:
742f66c5aafSOliver-Rainer Wittmann                 if (mbLoadingTOCHyperlink)
743f66c5aafSOliver-Rainer Wittmann                     mbLoadingTOCHyperlink = false;
744cdf0e10cSrcweir                 pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT);
745f66c5aafSOliver-Rainer Wittmann                 break;
746cdf0e10cSrcweir             case 36:
747cdf0e10cSrcweir             case 68:
748cdf0e10cSrcweir                 //Move outside the section associated with this type of field
749cdf0e10cSrcweir                 *pPaM->GetPoint() = maFieldStack.back().maStartPos;
750cdf0e10cSrcweir                 break;
751cdf0e10cSrcweir             default:
752cdf0e10cSrcweir                 break;
753cdf0e10cSrcweir         }
754cdf0e10cSrcweir         maFieldStack.pop_back();
755cdf0e10cSrcweir     }
756cdf0e10cSrcweir     return nRet;
757cdf0e10cSrcweir }
758cdf0e10cSrcweir 
AcceptableNestedField(sal_uInt16 nFieldCode)759cdf0e10cSrcweir bool AcceptableNestedField(sal_uInt16 nFieldCode)
760cdf0e10cSrcweir {
761cdf0e10cSrcweir     switch (nFieldCode)
762cdf0e10cSrcweir     {
763f66c5aafSOliver-Rainer Wittmann         case 8:  // allow recursive field in TOC...
764f66c5aafSOliver-Rainer Wittmann         case 13: // allow recursive field in TOC...
765cdf0e10cSrcweir         case 36:
766cdf0e10cSrcweir         case 68:
767cdf0e10cSrcweir         case 79:
768cdf0e10cSrcweir         case 88:
769cdf0e10cSrcweir         // Accept AutoTextList field as nested field.
770cdf0e10cSrcweir         // Thus, the field result is imported as plain text.
771cdf0e10cSrcweir         case 89:
772cdf0e10cSrcweir             return true;
773cdf0e10cSrcweir         default:
774cdf0e10cSrcweir             return false;
775cdf0e10cSrcweir     }
776cdf0e10cSrcweir }
777cdf0e10cSrcweir 
FieldEntry(SwPosition & rPos,sal_uInt16 nFieldId)778cdf0e10cSrcweir FieldEntry::FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw()
779cdf0e10cSrcweir     : maStartPos(rPos), mnFieldId(nFieldId)
780cdf0e10cSrcweir {
781cdf0e10cSrcweir }
782cdf0e10cSrcweir 
FieldEntry(const FieldEntry & rOther)783cdf0e10cSrcweir FieldEntry::FieldEntry(const FieldEntry &rOther) throw()
784cdf0e10cSrcweir     : maStartPos(rOther.maStartPos), mnFieldId(rOther.mnFieldId)
785cdf0e10cSrcweir {
786cdf0e10cSrcweir }
787cdf0e10cSrcweir 
Swap(FieldEntry & rOther)788cdf0e10cSrcweir void FieldEntry::Swap(FieldEntry &rOther) throw()
789cdf0e10cSrcweir {
790cdf0e10cSrcweir     std::swap(maStartPos, rOther.maStartPos);
791cdf0e10cSrcweir     std::swap(mnFieldId, rOther.mnFieldId);
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
operator =(const FieldEntry & rOther)794cdf0e10cSrcweir FieldEntry &FieldEntry::operator=(const FieldEntry &rOther) throw()
795cdf0e10cSrcweir {
796cdf0e10cSrcweir     FieldEntry aTemp(rOther);
797cdf0e10cSrcweir     Swap(aTemp);
798cdf0e10cSrcweir     return *this;
799cdf0e10cSrcweir }
800cdf0e10cSrcweir 
GetBookmarkName()801cdf0e10cSrcweir ::rtl::OUString FieldEntry::GetBookmarkName()
802cdf0e10cSrcweir {
803cdf0e10cSrcweir     return msBookmarkName;
804cdf0e10cSrcweir }
805cdf0e10cSrcweir 
GetBookmarkType()806cdf0e10cSrcweir ::rtl::OUString FieldEntry::GetBookmarkType()
807cdf0e10cSrcweir {
808cdf0e10cSrcweir     return msMarkType;
809cdf0e10cSrcweir }
810cdf0e10cSrcweir 
SetBookmarkName(::rtl::OUString bookmarkName)811cdf0e10cSrcweir void FieldEntry::SetBookmarkName(::rtl::OUString bookmarkName)
812cdf0e10cSrcweir {
813cdf0e10cSrcweir     msBookmarkName=bookmarkName;
814cdf0e10cSrcweir }
815cdf0e10cSrcweir 
SetBookmarkType(::rtl::OUString bookmarkType)816cdf0e10cSrcweir void FieldEntry::SetBookmarkType(::rtl::OUString bookmarkType)
817cdf0e10cSrcweir {
818cdf0e10cSrcweir     msMarkType=bookmarkType;
819cdf0e10cSrcweir }
820cdf0e10cSrcweir 
821cdf0e10cSrcweir 
getParameters()822cdf0e10cSrcweir ::sw::mark::IFieldmark::parameter_map_t& FieldEntry::getParameters() {
823cdf0e10cSrcweir     return maParams;
824cdf0e10cSrcweir }
825cdf0e10cSrcweir 
826cdf0e10cSrcweir 
827cdf0e10cSrcweir // Read_Field liest ein Feld ein oder, wenn es nicht gelesen werden kann,
828cdf0e10cSrcweir // wird 0 zurueckgegeben, so dass das Feld vom Aufrufer textuell gelesen wird.
829cdf0e10cSrcweir // Returnwert: Gesamtlaenge des Feldes ( zum UEberlesen )
Read_Field(WW8PLCFManResult * pRes)830cdf0e10cSrcweir long SwWW8ImplReader::Read_Field(WW8PLCFManResult* pRes)
831cdf0e10cSrcweir {
832cdf0e10cSrcweir     typedef eF_ResT (SwWW8ImplReader:: *FNReadField)( WW8FieldDesc*, String& );
833cdf0e10cSrcweir     enum Limits {eMax = 96};
834cdf0e10cSrcweir     static FNReadField aWW8FieldTab[eMax+1] =
835cdf0e10cSrcweir     {
836cdf0e10cSrcweir         0,
837cdf0e10cSrcweir         0,
838cdf0e10cSrcweir         0,
839cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Ref,               // 3
840cdf0e10cSrcweir         0,
841cdf0e10cSrcweir         0,
842cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Set,               // 6
843cdf0e10cSrcweir         0,
844cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Tox,               // 8
845cdf0e10cSrcweir         0,
846cdf0e10cSrcweir         0,
847cdf0e10cSrcweir         0,
848cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Seq,               // 12
849cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Tox,               // 13
850cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 14
851cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 15
852cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 16
853cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Author,            // 17
854cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 18
855cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 19
856cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 20
857cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 21
858cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 22
859cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 23
860cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 24
861cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 25
862cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Anz,               // 26
863cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Anz,               // 27
864cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Anz,               // 28
865cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_FileName,          // 29
866cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_TemplName,         // 30
867cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DateTime,          // 31
868cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DateTime,          // 32
869cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_CurPage,           // 33
870cdf0e10cSrcweir         0,
871cdf0e10cSrcweir         0,
872cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_IncludeText,       // 36
873cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_PgRef,             // 37
874cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_InputVar,          // 38
875cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Input,             // 39
876cdf0e10cSrcweir         0,
877cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DBNext,            // 41
878cdf0e10cSrcweir         0,
879cdf0e10cSrcweir         0,
880cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DBNum,             // 44
881cdf0e10cSrcweir         0,
882cdf0e10cSrcweir         0,
883cdf0e10cSrcweir         0,
884cdf0e10cSrcweir         0,
885cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Equation,          // 49
886cdf0e10cSrcweir         0,
887cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Macro,             // 51
888cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_ANumber,           // 52
889cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_ANumber,           // 53
890cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_ANumber,           // 54
891cdf0e10cSrcweir         0,
892cdf0e10cSrcweir 
893cdf0e10cSrcweir 
894cdf0e10cSrcweir         0,      // 56: VERKNUePFUNG     // fehlt noch !!!!!!!!!!!!!!!!!!!!!!!
895cdf0e10cSrcweir 
896cdf0e10cSrcweir 
897cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Symbol,            // 57
898cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Embedd,            // 58
899cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DBField,           // 59
900cdf0e10cSrcweir         0,
901cdf0e10cSrcweir         0,
902cdf0e10cSrcweir         0,
903cdf0e10cSrcweir         0,
904cdf0e10cSrcweir         0,
905cdf0e10cSrcweir         0,
906cdf0e10cSrcweir         0,
907cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_IncludePicture,    // 67
908cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_IncludeText,       // 68
909cdf0e10cSrcweir         0,
910cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_FormTextBox,       // 70
911cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_FormCheckBox,      // 71
912cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_NoteReference,     // 72
913cdf0e10cSrcweir         0, /*&SwWW8ImplReader::Read_F_Tox*/
914cdf0e10cSrcweir         0,
915cdf0e10cSrcweir         0,
916cdf0e10cSrcweir         0,
917cdf0e10cSrcweir         0,
918cdf0e10cSrcweir         0,
919cdf0e10cSrcweir         0,
920cdf0e10cSrcweir         0,
921cdf0e10cSrcweir         0,
922cdf0e10cSrcweir         0,
923cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_FormListBox,       // 83
924cdf0e10cSrcweir         0,                                          // 84
925cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_DocInfo,           // 85
926cdf0e10cSrcweir         0,                                          // 86
927cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_OCX,               // 87
928cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Hyperlink,         // 88
929cdf0e10cSrcweir         0,                                          // 89
930cdf0e10cSrcweir         0,                                          // 90
931cdf0e10cSrcweir         0,                                          // 91
932cdf0e10cSrcweir         0,                                          // 92
933cdf0e10cSrcweir         0,                                          // 93
934cdf0e10cSrcweir         0,                                          // 94
935cdf0e10cSrcweir         &SwWW8ImplReader::Read_F_Shape,             // 95
936cdf0e10cSrcweir         0                                           // eMax - Dummy leer Methode
937cdf0e10cSrcweir     };
938cdf0e10cSrcweir     ASSERT( ( sizeof( aWW8FieldTab ) / sizeof( *aWW8FieldTab ) == eMax+1 ),
939cdf0e10cSrcweir             "FeldFunc-Tabelle stimmt nicht" );
940cdf0e10cSrcweir 
941cdf0e10cSrcweir     WW8PLCFx_FLD* pF = pPlcxMan->GetFld();
942cdf0e10cSrcweir     ASSERT(pF, "WW8PLCFx_FLD - Pointer nicht da");
943cdf0e10cSrcweir 
944cdf0e10cSrcweir     if (!pF || !pF->StartPosIsFieldStart())
945cdf0e10cSrcweir         return 0;
946cdf0e10cSrcweir 
947cdf0e10cSrcweir     bool bNested = false;
948cdf0e10cSrcweir     if (!maFieldStack.empty())
949cdf0e10cSrcweir     {
950cdf0e10cSrcweir         mycFieldIter aEnd = maFieldStack.end();
951cdf0e10cSrcweir         for(mycFieldIter aIter = maFieldStack.begin(); aIter != aEnd; ++aIter)
952cdf0e10cSrcweir         {
953cdf0e10cSrcweir             bNested = !AcceptableNestedField(aIter->mnFieldId);
954cdf0e10cSrcweir             if (bNested)
955cdf0e10cSrcweir                 break;
956cdf0e10cSrcweir         }
957cdf0e10cSrcweir     }
958cdf0e10cSrcweir 
959cdf0e10cSrcweir     WW8FieldDesc aF;
960cdf0e10cSrcweir     bool bOk = pF->GetPara(pRes->nCp2OrIdx, aF);
961cdf0e10cSrcweir 
962cdf0e10cSrcweir     ASSERT(bOk, "WW8: Bad Field!\n");
963cdf0e10cSrcweir     if (aF.nId == 33) aF.bCodeNest=false; //#124716#: do not recurse into nested page fields
964cdf0e10cSrcweir 
965cdf0e10cSrcweir     maFieldStack.push_back(FieldEntry(*pPaM->GetPoint(), aF.nId));
966cdf0e10cSrcweir 
967cdf0e10cSrcweir     if (bNested)
968cdf0e10cSrcweir         return 0;
969cdf0e10cSrcweir 
970205b6fc7SArmin Le Grand     sal_uInt16 n = (aF.nId <= eMax) ? aF.nId : static_cast<sal_uInt16>(eMax);
971cdf0e10cSrcweir     sal_uInt16 nI = n / 32;                     // # des sal_uInt32
972cdf0e10cSrcweir     sal_uLong nMask = 1 << ( n % 32 );          // Maske fuer Bits
973cdf0e10cSrcweir 
974205b6fc7SArmin Le Grand     if ((sizeof(nFieldTagAlways)/sizeof(nFieldTagAlways[0])) <= nI)
975205b6fc7SArmin Le Grand     {   // if indexes larger than 95 are needed, then a new configuration
976205b6fc7SArmin Le Grand         // item has to be added, and nFieldTagAlways/nFieldTagBad expanded!
977205b6fc7SArmin Le Grand         return aF.nLen;
978205b6fc7SArmin Le Grand     }
979205b6fc7SArmin Le Grand 
980cdf0e10cSrcweir     if( nFieldTagAlways[nI] & nMask )       // Flag: Tag it
981cdf0e10cSrcweir         return Read_F_Tag( &aF );           // Resultat nicht als Text
982cdf0e10cSrcweir 
983cdf0e10cSrcweir     if( !bOk || !aF.nId )                   // Feld kaputt
984cdf0e10cSrcweir         return aF.nLen;                     // -> ignorieren
985cdf0e10cSrcweir 
986cdf0e10cSrcweir     if( aF.nId > eMax - 1)                        // WW: Nested Field
987cdf0e10cSrcweir     {
988cdf0e10cSrcweir         if( nFieldTagBad[nI] & nMask )      // Flag: Tag it when bad
989cdf0e10cSrcweir             return Read_F_Tag( &aF );       // Resultat nicht als Text
990cdf0e10cSrcweir         else
991cdf0e10cSrcweir             return aF.nLen;
992cdf0e10cSrcweir     }
993cdf0e10cSrcweir 
994cdf0e10cSrcweir     //Only one type of field (hyperlink) in drawing textboxes exists
995cdf0e10cSrcweir     if (aF.nId != 88 && pPlcxMan && pPlcxMan->GetDoingDrawTextBox())
996cdf0e10cSrcweir         return aF.nLen;
997cdf0e10cSrcweir 
998cdf0e10cSrcweir     // keine Routine vorhanden
999cdf0e10cSrcweir     if (bNested || !aWW8FieldTab[aF.nId] || aF.bCodeNest)
1000cdf0e10cSrcweir     {
1001cdf0e10cSrcweir         if( nFieldTagBad[nI] & nMask )      // Flag: Tag it when bad
1002cdf0e10cSrcweir             return Read_F_Tag( &aF );       // Resultat nicht als Text
1003cdf0e10cSrcweir                                             // Lese nur Resultat
1004cdf0e10cSrcweir         if (aF.bResNest && !AcceptableNestedField(aF.nId))
1005cdf0e10cSrcweir             return aF.nLen;                 // Result nested -> nicht brauchbar
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir         long nOldPos = pStrm->Tell();
1008cdf0e10cSrcweir         String aStr;
1009cdf0e10cSrcweir         aF.nLCode = pSBase->WW8ReadString( *pStrm, aStr, pPlcxMan->GetCpOfs()+
1010cdf0e10cSrcweir             aF.nSCode, aF.nLCode, eTextCharSet );
1011cdf0e10cSrcweir         pStrm->Seek( nOldPos );
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir         //#124725# field codes which contain '/' or '.' are not displayed in WinWord
1014ea74200bSOliver-Rainer Wittmann         // skip if it is formula field or found space before. see #i119446, #i119585.
1015ea74200bSOliver-Rainer Wittmann         const xub_StrLen nDotPos = aStr.Search('.');
1016ea74200bSOliver-Rainer Wittmann         const xub_StrLen nSlashPos = aStr.Search('/');
1017ea74200bSOliver-Rainer Wittmann         xub_StrLen nSpacePos = aStr.Search( ' ', 1 );
1018ea74200bSOliver-Rainer Wittmann         if ( nSpacePos == STRING_NOTFOUND )
1019ea74200bSOliver-Rainer Wittmann             nSpacePos = aStr.Len();
1020ea74200bSOliver-Rainer Wittmann 
1021ea74200bSOliver-Rainer Wittmann         if ( !( aStr.EqualsAscii( "=", 1, 1 ) ) &&
1022ea74200bSOliver-Rainer Wittmann             ((( nDotPos != STRING_NOTFOUND ) && ( nDotPos < nSpacePos )) ||
1023ea74200bSOliver-Rainer Wittmann             (( nSlashPos != STRING_NOTFOUND ) && ( nSlashPos < nSpacePos ))))
1024cdf0e10cSrcweir             return aF.nLen;
1025cdf0e10cSrcweir         else
1026cdf0e10cSrcweir             return aF.nLen - aF.nLRes - 1;  // so viele ueberlesen, das Resultfeld
1027cdf0e10cSrcweir                                             // wird wie Haupttext eingelesen
1028cdf0e10cSrcweir     }
1029cdf0e10cSrcweir     else
1030cdf0e10cSrcweir     {                                   // Lies Feld
1031cdf0e10cSrcweir         long nOldPos = pStrm->Tell();
1032cdf0e10cSrcweir         String aStr;
1033cdf0e10cSrcweir         aF.nLCode = pSBase->WW8ReadString( *pStrm, aStr, pPlcxMan->GetCpOfs()+
1034cdf0e10cSrcweir             aF.nSCode, aF.nLCode, eTextCharSet );
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir         // --> OD 2005-07-25 #i51312# - graphics inside field code not supported
1037cdf0e10cSrcweir         // by Writer. Thus, delete character 0x01, which stands for such a graphic.
1038cdf0e10cSrcweir         if (aF.nId==51) //#i56768# only do it for the MACROBUTTON field, since DropListFields need the 0x01.
1039cdf0e10cSrcweir         {
1040cdf0e10cSrcweir             aStr.EraseAllChars( 0x01 );
1041cdf0e10cSrcweir         }
1042cdf0e10cSrcweir         // <--
1043cdf0e10cSrcweir 
1044cdf0e10cSrcweir         eF_ResT eRes = (this->*aWW8FieldTab[aF.nId])( &aF, aStr );
1045cdf0e10cSrcweir         pStrm->Seek( nOldPos );
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir         switch ( eRes )
1048cdf0e10cSrcweir         {
1049cdf0e10cSrcweir             case FLD_OK:
1050cdf0e10cSrcweir                 return aF.nLen;                     // alles OK
1051cdf0e10cSrcweir             case FLD_TAGTXT:
1052cdf0e10cSrcweir                 if ((nFieldTagBad[nI] & nMask)) // Flag: Tag bad
1053cdf0e10cSrcweir                     return Read_F_Tag(&aF);       // Taggen
1054cdf0e10cSrcweir                 //fall through...
1055cdf0e10cSrcweir             case FLD_TEXT:
1056cdf0e10cSrcweir                 // so viele ueberlesen, das Resultfeld wird wie Haupttext
1057cdf0e10cSrcweir                 // eingelesen
1058cdf0e10cSrcweir                 // JP 15.07.99: attributes can start at char 0x14 so skip one
1059cdf0e10cSrcweir                 // char more back == "-2"
1060cdf0e10cSrcweir                 if (aF.nLRes)
1061cdf0e10cSrcweir                     return aF.nLen - aF.nLRes - 2;
1062cdf0e10cSrcweir                 else
1063cdf0e10cSrcweir                     return aF.nLen;
1064cdf0e10cSrcweir             case FLD_TAGIGN:
1065cdf0e10cSrcweir                 if(  ( nFieldTagBad[nI] & nMask ) ) // Flag: Tag bad
1066cdf0e10cSrcweir                     return Read_F_Tag( &aF );       // Taggen
1067cdf0e10cSrcweir                 return aF.nLen;                 // oder ignorieren
1068cdf0e10cSrcweir             case FLD_READ_FSPA:
1069cdf0e10cSrcweir                 return aF.nLen - aF.nLRes - 2; // auf Char 1 positionieren
1070cdf0e10cSrcweir             default:
1071cdf0e10cSrcweir                 return aF.nLen;                     // ignorieren
1072cdf0e10cSrcweir         }
1073cdf0e10cSrcweir     }
1074cdf0e10cSrcweir }
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir //-----------------------------------------
1077cdf0e10cSrcweir //        Felder Taggen
1078cdf0e10cSrcweir //-----------------------------------------
1079cdf0e10cSrcweir 
1080cdf0e10cSrcweir // MakeTagString() gibt als Returnwert die Position des ersten
1081cdf0e10cSrcweir // CR / Zeilenende / Seitenumbruch in pText und wandelt auch nur bis dort
1082cdf0e10cSrcweir // Wenn keins dieser Sonderzeichen enthalten ist, wird 0 zurueckgeliefert.
MakeTagString(String & rStr,const String & rOrg)1083cdf0e10cSrcweir void SwWW8ImplReader::MakeTagString( String& rStr, const String& rOrg )
1084cdf0e10cSrcweir {
1085cdf0e10cSrcweir     String sHex( CREATE_CONST_ASC( "\\x" ));
1086cdf0e10cSrcweir     bool bAllowCr = SwFltGetFlag( nFieldFlags, SwFltControlStack::TAGS_IN_TEXT )
1087cdf0e10cSrcweir                 || SwFltGetFlag( nFieldFlags, SwFltControlStack::ALLOW_FLD_CR );
1088cdf0e10cSrcweir     sal_Unicode cChar;
1089cdf0e10cSrcweir     rStr = rOrg;
1090cdf0e10cSrcweir 
1091cdf0e10cSrcweir     for( xub_StrLen nI = 0;
1092cdf0e10cSrcweir             nI < rStr.Len() && rStr.Len() < (MAX_FIELDLEN - 4); ++nI )
1093cdf0e10cSrcweir     {
1094cdf0e10cSrcweir         bool bSetAsHex = false;
1095cdf0e10cSrcweir         switch( cChar = rStr.GetChar( nI ) )
1096cdf0e10cSrcweir         {
1097cdf0e10cSrcweir             case 132:                       // Typographische Anfuehrungszeichen
1098cdf0e10cSrcweir             case 148:                       // gegen normale tauschen
1099cdf0e10cSrcweir             case 147:
1100cdf0e10cSrcweir                 rStr.SetChar( nI, '"' );
1101cdf0e10cSrcweir                 break;
1102cdf0e10cSrcweir             case 19:
1103cdf0e10cSrcweir                 rStr.SetChar( nI, '{' );
1104cdf0e10cSrcweir                 break;  // 19..21 zu {|}
1105cdf0e10cSrcweir             case 20:
1106cdf0e10cSrcweir                 rStr.SetChar( nI, '|' );
1107cdf0e10cSrcweir                 break;
1108cdf0e10cSrcweir             case 21:
1109cdf0e10cSrcweir                 rStr.SetChar( nI, '}' );
1110cdf0e10cSrcweir                 break;
1111cdf0e10cSrcweir             case '\\':                      // \{|} per \ Taggen
1112cdf0e10cSrcweir             case '{':
1113cdf0e10cSrcweir             case '|':
1114cdf0e10cSrcweir             case '}':
1115cdf0e10cSrcweir                 rStr.Insert( nI, '\\' );
1116cdf0e10cSrcweir                 ++nI;
1117cdf0e10cSrcweir                 break;
1118cdf0e10cSrcweir             case 0x0b:
1119cdf0e10cSrcweir             case 0x0c:
1120cdf0e10cSrcweir             case 0x0d:
1121cdf0e10cSrcweir                 if( bAllowCr )
1122cdf0e10cSrcweir                     rStr.SetChar( nI, '\n' );
1123cdf0e10cSrcweir                 else
1124cdf0e10cSrcweir                     bSetAsHex = true;
1125cdf0e10cSrcweir                 break;
1126cdf0e10cSrcweir             case 0xFE:
1127cdf0e10cSrcweir             case 0xFF:
1128cdf0e10cSrcweir                 bSetAsHex = true;
1129cdf0e10cSrcweir                 break;
1130cdf0e10cSrcweir             default:
1131cdf0e10cSrcweir                 bSetAsHex = 0x20 > cChar;
1132cdf0e10cSrcweir                 break;
1133cdf0e10cSrcweir         }
1134cdf0e10cSrcweir 
1135cdf0e10cSrcweir         if( bSetAsHex )
1136cdf0e10cSrcweir         {
1137cdf0e10cSrcweir             //all Hex-Numbers with \x before
1138cdf0e10cSrcweir             String sTmp( sHex );
1139cdf0e10cSrcweir             if( cChar < 0x10 )
1140cdf0e10cSrcweir                 sTmp += '0';
1141cdf0e10cSrcweir             sTmp += String::CreateFromInt32( cChar, 16 );
1142cdf0e10cSrcweir             rStr.Replace( nI, 1 , sTmp );
1143cdf0e10cSrcweir             nI += sTmp.Len() - 1;
1144cdf0e10cSrcweir         }
1145cdf0e10cSrcweir     }
1146cdf0e10cSrcweir 
1147cdf0e10cSrcweir     if( rStr.Len() > (MAX_FIELDLEN - 4))
1148cdf0e10cSrcweir         rStr.Erase( MAX_FIELDLEN - 4 );
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir 
InsertTagField(const sal_uInt16 nId,const String & rTagText)1151cdf0e10cSrcweir void SwWW8ImplReader::InsertTagField( const sal_uInt16 nId, const String& rTagText )
1152cdf0e10cSrcweir {
1153cdf0e10cSrcweir     String aName( CREATE_CONST_ASC( "WwFieldTag" ) );
1154cdf0e10cSrcweir     if( SwFltGetFlag( nFieldFlags, SwFltControlStack::TAGS_DO_ID ) ) // Nummer?
1155cdf0e10cSrcweir         aName += String::CreateFromInt32( nId );                    // ausgeben ?
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir     if( SwFltGetFlag(nFieldFlags, SwFltControlStack::TAGS_IN_TEXT))
1158cdf0e10cSrcweir     {
1159cdf0e10cSrcweir         aName += rTagText;      // als Txt taggen
1160cdf0e10cSrcweir         rDoc.InsertString(*pPaM, aName,
1161cdf0e10cSrcweir                 IDocumentContentOperations::INS_NOHINTEXPAND);
1162cdf0e10cSrcweir     }
1163cdf0e10cSrcweir     else
1164cdf0e10cSrcweir     {                                                   // normal tagggen
1165cdf0e10cSrcweir 
1166cdf0e10cSrcweir         SwFieldType* pFT = rDoc.InsertFldType(
1167cdf0e10cSrcweir                                 SwSetExpFieldType( &rDoc, aName, nsSwGetSetExpType::GSE_STRING ) );
1168cdf0e10cSrcweir         SwSetExpField aFld( (SwSetExpFieldType*)pFT, rTagText );                            // SUB_INVISIBLE
1169cdf0e10cSrcweir         sal_uInt16 nSubType = ( SwFltGetFlag( nFieldFlags, SwFltControlStack::TAGS_VISIBLE ) ) ? 0 : nsSwExtendedSubType::SUB_INVISIBLE;
1170cdf0e10cSrcweir         aFld.SetSubType(nSubType | nsSwGetSetExpType::GSE_STRING);
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir         rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1173cdf0e10cSrcweir     }
1174cdf0e10cSrcweir }
1175cdf0e10cSrcweir 
Read_F_Tag(WW8FieldDesc * pF)1176cdf0e10cSrcweir long SwWW8ImplReader::Read_F_Tag( WW8FieldDesc* pF )
1177cdf0e10cSrcweir {
1178cdf0e10cSrcweir     long nOldPos = pStrm->Tell();
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir     WW8_CP nStart = pF->nSCode - 1;         // mit 0x19 am Anfang
1181cdf0e10cSrcweir     long nL = pF->nLen;                     // Gesamtlaenge mit Resultat u. Nest
1182cdf0e10cSrcweir     if( nL > MAX_FIELDLEN )
1183cdf0e10cSrcweir         nL = MAX_FIELDLEN;                  // MaxLaenge, durch Quoten
1184cdf0e10cSrcweir                                             // max. 4* so gross
1185cdf0e10cSrcweir     String sFTxt;
1186cdf0e10cSrcweir     nL = pSBase->WW8ReadString( *pStrm, sFTxt,
1187cdf0e10cSrcweir                                 pPlcxMan->GetCpOfs() + nStart, nL, eStructCharSet);
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir 
1190cdf0e10cSrcweir     String aTagText;
1191cdf0e10cSrcweir     MakeTagString( aTagText, sFTxt );
1192cdf0e10cSrcweir     InsertTagField( pF->nId, aTagText );
1193cdf0e10cSrcweir 
1194cdf0e10cSrcweir     pStrm->Seek( nOldPos );
1195cdf0e10cSrcweir     return pF->nLen;
1196cdf0e10cSrcweir }
1197cdf0e10cSrcweir 
1198cdf0e10cSrcweir 
1199cdf0e10cSrcweir //-----------------------------------------
1200cdf0e10cSrcweir //        normale Felder
1201cdf0e10cSrcweir //-----------------------------------------
1202cdf0e10cSrcweir 
Read_F_Input(WW8FieldDesc * pF,String & rStr)1203cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Input( WW8FieldDesc* pF, String& rStr )
1204cdf0e10cSrcweir {
1205cdf0e10cSrcweir     String aDef;
1206cdf0e10cSrcweir     String aQ;
1207cdf0e10cSrcweir     long nRet;
1208cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
1209cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
1210cdf0e10cSrcweir     {
1211cdf0e10cSrcweir         switch( nRet )
1212cdf0e10cSrcweir         {
1213cdf0e10cSrcweir         case -2:
1214cdf0e10cSrcweir             if( !aQ.Len() )
1215cdf0e10cSrcweir                 aQ = aReadParam.GetResult();
1216cdf0e10cSrcweir             break;
1217cdf0e10cSrcweir         case 'd':
1218cdf0e10cSrcweir         case 'D':
1219cdf0e10cSrcweir             {
1220cdf0e10cSrcweir                 xub_StrLen n = aReadParam.GoToTokenParam();
1221cdf0e10cSrcweir                 if( STRING_NOTFOUND != n )
1222cdf0e10cSrcweir                     aDef = aReadParam.GetResult();
1223cdf0e10cSrcweir             }
1224cdf0e10cSrcweir             break;
1225cdf0e10cSrcweir         }
1226cdf0e10cSrcweir     }
1227cdf0e10cSrcweir     if( !aDef.Len() )
1228cdf0e10cSrcweir         aDef = GetFieldResult( pF );
1229cdf0e10cSrcweir 
123069a74367SOliver-Rainer Wittmann     SwInputField aFld( static_cast<SwInputFieldType*>(rDoc.GetSysFldType( RES_INPUTFLD )),
123169a74367SOliver-Rainer Wittmann                         aDef, aQ, INP_TXT, 0, false );
1232cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1233cdf0e10cSrcweir 
1234cdf0e10cSrcweir     return FLD_OK;
1235cdf0e10cSrcweir }
1236cdf0e10cSrcweir 
1237cdf0e10cSrcweir // GetFieldResult alloziert einen String und liest das Feld-Resultat ein
GetFieldResult(WW8FieldDesc * pF)1238cdf0e10cSrcweir String SwWW8ImplReader::GetFieldResult( WW8FieldDesc* pF )
1239cdf0e10cSrcweir {
1240cdf0e10cSrcweir     long nOldPos = pStrm->Tell();
1241cdf0e10cSrcweir 
1242cdf0e10cSrcweir     WW8_CP nStart = pF->nSRes;              // Start Resultat
1243cdf0e10cSrcweir     long nL = pF->nLRes;                    // Laenge Resultat
1244cdf0e10cSrcweir     if( !nL )
1245cdf0e10cSrcweir         return aEmptyStr;                           // kein Resultat
1246cdf0e10cSrcweir 
1247cdf0e10cSrcweir     if( nL > MAX_FIELDLEN )
1248cdf0e10cSrcweir         nL = MAX_FIELDLEN;                  // MaxLaenge, durch Quoten
1249cdf0e10cSrcweir                                             // max. 4* so gross
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir     String sRes;
1252cdf0e10cSrcweir     nL = pSBase->WW8ReadString( *pStrm, sRes, pPlcxMan->GetCpOfs() + nStart,
1253cdf0e10cSrcweir                                 nL, eStructCharSet );
1254cdf0e10cSrcweir 
1255cdf0e10cSrcweir     pStrm->Seek( nOldPos );
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir     //replace CR 0x0D with LF 0x0A
1258cdf0e10cSrcweir     sRes.SearchAndReplaceAll(0x0D, 0x0A);
1259cdf0e10cSrcweir     //replace VT 0x0B with LF 0x0A
1260cdf0e10cSrcweir     sRes.SearchAndReplaceAll(0x0B, 0x0A);
1261cdf0e10cSrcweir     return sRes;
1262cdf0e10cSrcweir }
1263cdf0e10cSrcweir 
1264cdf0e10cSrcweir /*
1265cdf0e10cSrcweir Bookmarks can be set with fields SET and ASK, and they can be referenced with
1266cdf0e10cSrcweir REF. When set, they behave like variables in writer, otherwise they behave
1267cdf0e10cSrcweir like normal bookmarks. We can check whether we should use a show variable
1268cdf0e10cSrcweir instead of a normal bookmark ref by converting to "show variable" at the end
1269cdf0e10cSrcweir of the document those refs which look for the content of a bookmark but whose
1270cdf0e10cSrcweir bookmarks were set with SET or ASK. (See SwWW8FltRefStack)
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir The other piece of the puzzle is that refs that point to the "location" of the
1273cdf0e10cSrcweir bookmark will in word actually point to the last location where the bookmark
1274cdf0e10cSrcweir was set with SET or ASK, not the actual bookmark. This is only noticable when
1275cdf0e10cSrcweir a document sets the bookmark more than once. This is because word places the
1276cdf0e10cSrcweir true bookmark at the location of the last set, but the refs will display the
1277cdf0e10cSrcweir position of the first set before the ref.
1278cdf0e10cSrcweir 
1279cdf0e10cSrcweir So what we will do is
1280cdf0e10cSrcweir 
1281cdf0e10cSrcweir 1) keep a list of all bookmarks that were set, any bookmark names mentioned
1282cdf0e10cSrcweir here that are refed by content will be converted to show variables.
1283cdf0e10cSrcweir 
1284cdf0e10cSrcweir 2) create pseudo bookmarks for every position that a bookmark is set with SET
1285cdf0e10cSrcweir or ASK but has no existing bookmark. We can then keep a map from the original
1286cdf0e10cSrcweir bookmark name to the new one. As we parse the document new pseudo names will
1287cdf0e10cSrcweir replace the older ones, so the map always contains the bookmark of the
1288cdf0e10cSrcweir location that msword itself would use.
1289cdf0e10cSrcweir 
1290cdf0e10cSrcweir 3) word's bookmarks are case insensitive, writers are not. So we need to
1291cdf0e10cSrcweir map case different versions together, regardless of whether they are
1292cdf0e10cSrcweir variables or not.
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir 4) when a reference is (first) SET or ASK, the bookmark associated with it
1295cdf0e10cSrcweir is placed around the 0x14 0x15 result part of the field. We will fiddle
1296cdf0e10cSrcweir the placement to be the writer equivalent of directly before and after
1297cdf0e10cSrcweir the field, which gives the same effect and meaning, to do so we must
1298cdf0e10cSrcweir get any bookmarks in the field range, and begin them immediately before
1299cdf0e10cSrcweir the set/ask field, and end them directly afterwards. MapBookmarkVariables
1300cdf0e10cSrcweir returns an identifier of the bookmark attribute to close after inserting
1301cdf0e10cSrcweir the appropiate set/ask field.
1302cdf0e10cSrcweir */
MapBookmarkVariables(const WW8FieldDesc * pF,String & rOrigName,const String & rData)1303cdf0e10cSrcweir long SwWW8ImplReader::MapBookmarkVariables(const WW8FieldDesc* pF,
1304cdf0e10cSrcweir     String &rOrigName, const String &rData)
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir     ASSERT(pPlcxMan,"No pPlcxMan");
1307cdf0e10cSrcweir     long nNo;
1308cdf0e10cSrcweir     /*
1309cdf0e10cSrcweir     If there was no bookmark associated with this set field, then we create a
1310cdf0e10cSrcweir     pseudo one and insert it in the document.
1311cdf0e10cSrcweir     */
1312cdf0e10cSrcweir     sal_uInt16 nIndex;
1313cdf0e10cSrcweir     pPlcxMan->GetBook()->MapName(rOrigName);
1314cdf0e10cSrcweir     String sName = pPlcxMan->GetBook()->GetBookmark(
1315cdf0e10cSrcweir         pF->nSCode, pF->nSCode + pF->nLen, nIndex);
1316cdf0e10cSrcweir     if (sName.Len())
1317cdf0e10cSrcweir     {
1318cdf0e10cSrcweir         pPlcxMan->GetBook()->SetStatus(nIndex, BOOK_IGNORE);
1319cdf0e10cSrcweir         nNo = nIndex;
1320cdf0e10cSrcweir     }
1321cdf0e10cSrcweir     else
1322cdf0e10cSrcweir     {
1323cdf0e10cSrcweir         sName = CREATE_CONST_ASC("WWSetBkmk");
1324cdf0e10cSrcweir         nNo = pReffingStck->aFieldVarNames.size()+1;
1325cdf0e10cSrcweir         sName += String::CreateFromInt32(nNo);
1326cdf0e10cSrcweir         nNo += pPlcxMan->GetBook()->GetIMax();
1327cdf0e10cSrcweir     }
1328cdf0e10cSrcweir     pReffedStck->NewAttr(*pPaM->GetPoint(),
13293078b051SOliver-Rainer Wittmann         SwFltBookmark( BookmarkToWriter(sName), rData, nNo ));
1330cdf0e10cSrcweir     pReffingStck->aFieldVarNames[rOrigName] = sName;
1331cdf0e10cSrcweir     return nNo;
1332cdf0e10cSrcweir }
1333cdf0e10cSrcweir 
1334cdf0e10cSrcweir /*
1335cdf0e10cSrcweir Word can set a bookmark with set or with ask, such a bookmark is equivalent to
1336cdf0e10cSrcweir our variables, but until the end of a document we cannot be sure if a bookmark
1337cdf0e10cSrcweir is a variable or not, at the end we will have a list of reference names which
1338cdf0e10cSrcweir were set or asked, all bookmarks using the content of those bookmarks are
1339cdf0e10cSrcweir converted to show variables, those that reference the position of the field
1340cdf0e10cSrcweir can be left as references, because a bookmark is also inserted at the position
1341cdf0e10cSrcweir of a set or ask field, either by word, or in some special cases by the import
1342cdf0e10cSrcweir filter itself.
1343cdf0e10cSrcweir */
RefToVar(const SwField * pFld,SwFltStackEntry * pEntry)1344cdf0e10cSrcweir SwFltStackEntry *SwWW8FltRefStack::RefToVar(const SwField* pFld,
1345cdf0e10cSrcweir     SwFltStackEntry *pEntry)
1346cdf0e10cSrcweir {
1347cdf0e10cSrcweir     SwFltStackEntry *pRet=0;
1348cdf0e10cSrcweir     if (pFld && RES_GETREFFLD == pFld->Which())
1349cdf0e10cSrcweir     {
1350cdf0e10cSrcweir         //Get the name of the ref field, and see if actually a variable
1351cdf0e10cSrcweir         const String &rName = pFld->GetPar1();
13523078b051SOliver-Rainer Wittmann         ::std::map<String,String,SwWW8::ltstr>::const_iterator
1353cdf0e10cSrcweir             aResult = aFieldVarNames.find(rName);
1354cdf0e10cSrcweir 
1355cdf0e10cSrcweir         if (aResult != aFieldVarNames.end())
1356cdf0e10cSrcweir         {
1357cdf0e10cSrcweir             SwGetExpField aFld( (SwGetExpFieldType*)
1358cdf0e10cSrcweir                 pDoc->GetSysFldType(RES_GETEXPFLD), rName, nsSwGetSetExpType::GSE_STRING, 0);
1359cdf0e10cSrcweir             delete pEntry->pAttr;
1360cdf0e10cSrcweir             SwFmtFld aTmp(aFld);
1361cdf0e10cSrcweir             pEntry->pAttr = aTmp.Clone();
1362cdf0e10cSrcweir             pRet = pEntry;
1363cdf0e10cSrcweir         }
1364cdf0e10cSrcweir     }
1365cdf0e10cSrcweir     return pRet;
1366cdf0e10cSrcweir }
1367cdf0e10cSrcweir 
GetMappedBookmark(const String & rOrigName)1368cdf0e10cSrcweir String SwWW8ImplReader::GetMappedBookmark(const String &rOrigName)
1369cdf0e10cSrcweir {
1370cdf0e10cSrcweir     String sName(BookmarkToWriter(rOrigName));
1371cdf0e10cSrcweir     ASSERT(pPlcxMan,"no pPlcxMan");
1372cdf0e10cSrcweir     pPlcxMan->GetBook()->MapName(sName);
1373cdf0e10cSrcweir 
1374cdf0e10cSrcweir     //See if there has been a variable set with this name, if so get
1375cdf0e10cSrcweir     //the pseudo bookmark name that was set with it.
13763078b051SOliver-Rainer Wittmann     ::std::map<String,String,SwWW8::ltstr>::const_iterator aResult =
1377cdf0e10cSrcweir             pReffingStck->aFieldVarNames.find(sName);
1378cdf0e10cSrcweir 
1379cdf0e10cSrcweir     const String &rBkmName = (aResult == pReffingStck->aFieldVarNames.end())
1380cdf0e10cSrcweir         ? sName : (*aResult).second;
1381cdf0e10cSrcweir 
1382cdf0e10cSrcweir     return rBkmName;
1383cdf0e10cSrcweir }
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir // "ASK"
Read_F_InputVar(WW8FieldDesc * pF,String & rStr)1386cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_InputVar( WW8FieldDesc* pF, String& rStr )
1387cdf0e10cSrcweir {
1388cdf0e10cSrcweir     String sOrigName;
1389cdf0e10cSrcweir     String aQ;
1390cdf0e10cSrcweir     String aDef;
1391cdf0e10cSrcweir     long nRet;
1392cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
1393cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
1394cdf0e10cSrcweir     {
1395cdf0e10cSrcweir         switch( nRet )
1396cdf0e10cSrcweir         {
1397cdf0e10cSrcweir         case -2:
1398cdf0e10cSrcweir             if (!sOrigName.Len())
1399cdf0e10cSrcweir                 sOrigName = aReadParam.GetResult();
1400cdf0e10cSrcweir             else if( !aQ.Len() )
1401cdf0e10cSrcweir                 aQ = aReadParam.GetResult();
1402cdf0e10cSrcweir             break;
1403cdf0e10cSrcweir         case 'd':
1404cdf0e10cSrcweir         case 'D':
1405cdf0e10cSrcweir             if (STRING_NOTFOUND != aReadParam.GoToTokenParam())
1406cdf0e10cSrcweir                 aDef = aReadParam.GetResult();
1407cdf0e10cSrcweir             break;
1408cdf0e10cSrcweir         }
1409cdf0e10cSrcweir     }
1410cdf0e10cSrcweir 
1411cdf0e10cSrcweir     if( !sOrigName.Len() )
1412cdf0e10cSrcweir         return FLD_TAGIGN;  // macht ohne Textmarke keinen Sinn
1413cdf0e10cSrcweir 
1414cdf0e10cSrcweir     String aResult(GetFieldResult(pF));
1415cdf0e10cSrcweir 
1416cdf0e10cSrcweir     //#i24377#, munge Default Text into title as we have only one slot
1417cdf0e10cSrcweir     //available for aResult and aDef otherwise
1418cdf0e10cSrcweir     if (aDef.Len())
1419cdf0e10cSrcweir     {
1420cdf0e10cSrcweir         if (aQ.Len())
1421cdf0e10cSrcweir             aQ.APPEND_CONST_ASC(" - ");
1422cdf0e10cSrcweir         aQ.Append(aDef);
1423cdf0e10cSrcweir     }
1424cdf0e10cSrcweir 
1425cdf0e10cSrcweir     long nNo = MapBookmarkVariables(pF, sOrigName, aResult);
1426cdf0e10cSrcweir 
1427cdf0e10cSrcweir     SwSetExpFieldType* pFT = (SwSetExpFieldType*)rDoc.InsertFldType(
1428cdf0e10cSrcweir         SwSetExpFieldType(&rDoc, sOrigName, nsSwGetSetExpType::GSE_STRING));
1429cdf0e10cSrcweir     SwSetExpField aFld(pFT, aResult);
1430cdf0e10cSrcweir     aFld.SetSubType(nsSwExtendedSubType::SUB_INVISIBLE | nsSwGetSetExpType::GSE_STRING);
1431cdf0e10cSrcweir     aFld.SetInputFlag(true);
1432cdf0e10cSrcweir     aFld.SetPromptText( aQ );
1433cdf0e10cSrcweir 
1434cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1435cdf0e10cSrcweir 
1436cdf0e10cSrcweir     pReffedStck->SetAttr(*pPaM->GetPoint(), RES_FLTR_BOOKMARK, true, nNo);
1437cdf0e10cSrcweir     return FLD_OK;
1438cdf0e10cSrcweir }
1439cdf0e10cSrcweir 
1440cdf0e10cSrcweir // "AUTONR"
Read_F_ANumber(WW8FieldDesc *,String & rStr)1441cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_ANumber( WW8FieldDesc*, String& rStr )
1442cdf0e10cSrcweir {
1443cdf0e10cSrcweir     if( !pNumFldType ){     // 1. Mal
1444cdf0e10cSrcweir         SwSetExpFieldType aT( &rDoc, CREATE_CONST_ASC("AutoNr"), nsSwGetSetExpType::GSE_SEQ );
1445cdf0e10cSrcweir         pNumFldType = rDoc.InsertFldType( aT );
1446cdf0e10cSrcweir     }
1447cdf0e10cSrcweir     SwSetExpField aFld( (SwSetExpFieldType*)pNumFldType, aEmptyStr,
1448cdf0e10cSrcweir                         GetNumberPara( rStr ) );
1449cdf0e10cSrcweir     aFld.SetValue( ++nFldNum );
1450cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1451cdf0e10cSrcweir     return FLD_OK;
1452cdf0e10cSrcweir }
1453cdf0e10cSrcweir 
1454cdf0e10cSrcweir // "SEQ"
Read_F_Seq(WW8FieldDesc *,String & rStr)1455cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Seq( WW8FieldDesc*, String& rStr )
1456cdf0e10cSrcweir {
1457cdf0e10cSrcweir     String aSequenceName;
1458cdf0e10cSrcweir     String aBook;
1459cdf0e10cSrcweir     bool bHidden    = false;
1460cdf0e10cSrcweir     bool bFormat    = false;
1461cdf0e10cSrcweir     bool bShowLast  = false;
1462cdf0e10cSrcweir     bool bCountOn   = true;
1463cdf0e10cSrcweir     String sStart;
1464cdf0e10cSrcweir     SvxExtNumType eNumFormat = SVX_NUM_ARABIC;
1465cdf0e10cSrcweir     long nRet;
1466cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
1467cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
1468cdf0e10cSrcweir     {
1469cdf0e10cSrcweir         switch( nRet )
1470cdf0e10cSrcweir         {
1471cdf0e10cSrcweir         case -2:
1472cdf0e10cSrcweir             if( !aSequenceName.Len() )
1473cdf0e10cSrcweir                 aSequenceName = aReadParam.GetResult();
1474cdf0e10cSrcweir             else if( !aBook.Len() )
1475cdf0e10cSrcweir                 aBook = aReadParam.GetResult();
1476cdf0e10cSrcweir             break;
1477cdf0e10cSrcweir 
1478cdf0e10cSrcweir         case 'h':
1479cdf0e10cSrcweir             if( !bFormat )
1480cdf0e10cSrcweir                 bHidden = true;             // Hidden-Flag aktivieren
1481cdf0e10cSrcweir             break;
1482cdf0e10cSrcweir 
1483cdf0e10cSrcweir         case '*':
1484cdf0e10cSrcweir             bFormat = true;                 // Format-Flag aktivieren
1485cdf0e10cSrcweir             bHidden = false;                // Hidden-Flag deaktivieren
1486cdf0e10cSrcweir             nRet = aReadParam.SkipToNextToken();
1487d7427fd4SLei De Bin             if( -2 == nRet && !( aReadParam.GetResult().EqualsAscii("MERGEFORMAT") || aReadParam.GetResult().EqualsAscii("CHARFORMAT") ))
1488cdf0e10cSrcweir                 eNumFormat = GetNumTypeFromName( aReadParam.GetResult() );
1489cdf0e10cSrcweir             break;
1490cdf0e10cSrcweir 
1491cdf0e10cSrcweir         case 'r':
1492cdf0e10cSrcweir             bShowLast = false;              // Zaehler neu setzen
1493cdf0e10cSrcweir             bCountOn  = false;
1494cdf0e10cSrcweir             nRet = aReadParam.SkipToNextToken();
1495cdf0e10cSrcweir             if( -2 == nRet )
1496cdf0e10cSrcweir                 sStart = aReadParam.GetResult();
1497cdf0e10cSrcweir             break;
1498cdf0e10cSrcweir 
1499cdf0e10cSrcweir         case 'c':
1500cdf0e10cSrcweir             bShowLast = true;           // zuletzt verwendete Nummer anzeigen
1501cdf0e10cSrcweir             bCountOn  = false;
1502cdf0e10cSrcweir             break;
1503cdf0e10cSrcweir 
1504cdf0e10cSrcweir         case 'n':
1505cdf0e10cSrcweir             bCountOn  = true;               // Nummer um eins erhoehen (default)
1506cdf0e10cSrcweir             bShowLast = false;
1507cdf0e10cSrcweir             break;
1508cdf0e10cSrcweir 
1509cdf0e10cSrcweir         case 's':                       // Outline Level
1510cdf0e10cSrcweir             //#i19682, what am I to do with this value
1511cdf0e10cSrcweir             break;
1512cdf0e10cSrcweir         }
1513cdf0e10cSrcweir     }
1514cdf0e10cSrcweir     if (!aSequenceName.Len() && !aBook.Len())
1515cdf0e10cSrcweir         return FLD_TAGIGN;
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir     SwSetExpFieldType* pFT = (SwSetExpFieldType*)rDoc.InsertFldType(
1518cdf0e10cSrcweir                         SwSetExpFieldType( &rDoc, aSequenceName, nsSwGetSetExpType::GSE_SEQ ) );
1519cdf0e10cSrcweir     SwSetExpField aFld( pFT, aEmptyStr, eNumFormat );
1520cdf0e10cSrcweir 
1521bfb58ec6SJian Hong Cheng 	//Bug 120654: Add for /h flag(/h: Hiden the field result.)
1522bfb58ec6SJian Hong Cheng 	if (bHidden)
1523bfb58ec6SJian Hong Cheng 	aFld.SetSubType(aFld.GetSubType() | nsSwExtendedSubType::SUB_INVISIBLE);
1524bfb58ec6SJian Hong Cheng 	//Bug 120654(End)
1525bfb58ec6SJian Hong Cheng 
1526bfb58ec6SJian Hong Cheng 
1527cdf0e10cSrcweir     if (sStart.Len())
1528cdf0e10cSrcweir         aFld.SetFormula( ( aSequenceName += '=' ) += sStart );
1529cdf0e10cSrcweir     else if (!bCountOn)
1530cdf0e10cSrcweir         aFld.SetFormula(aSequenceName);
1531cdf0e10cSrcweir 
1532cdf0e10cSrcweir     rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
1533cdf0e10cSrcweir     return FLD_OK;
1534cdf0e10cSrcweir }
1535cdf0e10cSrcweir 
Read_F_DocInfo(WW8FieldDesc * pF,String & rStr)1536cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_DocInfo( WW8FieldDesc* pF, String& rStr )
1537cdf0e10cSrcweir {
1538cdf0e10cSrcweir     sal_uInt16 nSub=0;
1539cdf0e10cSrcweir     // RegInfoFormat, DefaultFormat fuer DocInfoFelder
1540cdf0e10cSrcweir     sal_uInt16 nReg = DI_SUB_AUTHOR;
1541cdf0e10cSrcweir     bool bDateTime = false;
1542cdf0e10cSrcweir 
1543cdf0e10cSrcweir     if( 85 == pF->nId )
1544cdf0e10cSrcweir     {
1545cdf0e10cSrcweir         String aDocProperty;
1546cdf0e10cSrcweir         _ReadFieldParams aReadParam( rStr );
1547cdf0e10cSrcweir         long nRet;
1548cdf0e10cSrcweir         while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
1549cdf0e10cSrcweir         {
1550cdf0e10cSrcweir             switch( nRet )
1551cdf0e10cSrcweir             {
1552cdf0e10cSrcweir                 case -2:
1553cdf0e10cSrcweir                     if( !aDocProperty.Len() )
1554cdf0e10cSrcweir                         aDocProperty = aReadParam.GetResult();
1555cdf0e10cSrcweir                     break;
1556cdf0e10cSrcweir                 case '*':
1557cdf0e10cSrcweir                     //Skip over MERGEFORMAT
1558cdf0e10cSrcweir                     aReadParam.SkipToNextToken();
1559cdf0e10cSrcweir                     break;
1560cdf0e10cSrcweir             }
1561cdf0e10cSrcweir         }
1562cdf0e10cSrcweir         aDocProperty.EraseAllChars('"');
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir         /*
1565cdf0e10cSrcweir         There are up to 26 fields that may be meant by 'DocumentProperty'.
1566cdf0e10cSrcweir         Which of them is to be inserted here ?
1567cdf0e10cSrcweir         This Problem can only be solved by implementing a name matching
1568cdf0e10cSrcweir         method that compares the given Parameter String with the four
1569cdf0e10cSrcweir         possible name sets (english, german, french, spanish)
1570cdf0e10cSrcweir         */
1571cdf0e10cSrcweir 
1572cdf0e10cSrcweir         static const sal_Char* aName10 = "\x0F"; // SW field code
1573cdf0e10cSrcweir         static const sal_Char* aName11 // German
1574cdf0e10cSrcweir             = "TITEL";
1575cdf0e10cSrcweir         static const sal_Char* aName12 // French
1576cdf0e10cSrcweir             = "TITRE";
1577cdf0e10cSrcweir         static const sal_Char* aName13 // English
1578cdf0e10cSrcweir             = "TITLE";
1579cdf0e10cSrcweir         static const sal_Char* aName14 // Spanish
1580cdf0e10cSrcweir             = "TITRO";
1581cdf0e10cSrcweir         static const sal_Char* aName20 = "\x15"; // SW filed code
1582cdf0e10cSrcweir         static const sal_Char* aName21 // German
1583cdf0e10cSrcweir             = "ERSTELLDATUM";
1584cdf0e10cSrcweir         static const sal_Char* aName22 // French
1585cdf0e10cSrcweir             = "CR\xC9\xC9";
1586cdf0e10cSrcweir         static const sal_Char* aName23 // English
1587cdf0e10cSrcweir             = "CREATED";
1588cdf0e10cSrcweir         static const sal_Char* aName24 // Spanish
1589cdf0e10cSrcweir             = "CREADO";
1590cdf0e10cSrcweir         static const sal_Char* aName30 = "\x16"; // SW filed code
1591cdf0e10cSrcweir         static const sal_Char* aName31 // German
1592cdf0e10cSrcweir             = "ZULETZTGESPEICHERTZEIT";
1593cdf0e10cSrcweir         static const sal_Char* aName32 // French
1594cdf0e10cSrcweir             = "DERNIERENREGISTREMENT";
1595cdf0e10cSrcweir         static const sal_Char* aName33 // English
1596cdf0e10cSrcweir             = "SAVED";
1597cdf0e10cSrcweir         static const sal_Char* aName34 // Spanish
1598cdf0e10cSrcweir             = "MODIFICADO";
1599cdf0e10cSrcweir         static const sal_Char* aName40 = "\x17"; // SW filed code
1600cdf0e10cSrcweir         static const sal_Char* aName41 // German
1601cdf0e10cSrcweir             = "ZULETZTGEDRUCKT";
1602cdf0e10cSrcweir         static const sal_Char* aName42 // French
1603cdf0e10cSrcweir             = "DERNI\xC8" "REIMPRESSION";
1604cdf0e10cSrcweir         static const sal_Char* aName43 // English
1605cdf0e10cSrcweir             = "LASTPRINTED";
1606cdf0e10cSrcweir         static const sal_Char* aName44 // Spanish
1607cdf0e10cSrcweir             = "HUPS PUPS";
1608cdf0e10cSrcweir         static const sal_Char* aName50 = "\x18"; // SW filed code
1609cdf0e10cSrcweir         static const sal_Char* aName51 // German
1610cdf0e10cSrcweir             = "\xDC" "BERARBEITUNGSNUMMER";
1611cdf0e10cSrcweir         static const sal_Char* aName52 // French
1612cdf0e10cSrcweir             = "NUM\xC9" "RODEREVISION";
1613cdf0e10cSrcweir         static const sal_Char* aName53 // English
1614cdf0e10cSrcweir             = "REVISIONNUMBER";
1615cdf0e10cSrcweir         static const sal_Char* aName54 // Spanish
1616cdf0e10cSrcweir             = "SNUBBEL BUBBEL";
1617cdf0e10cSrcweir         static const sal_uInt16 nFldCnt  = 5;
1618cdf0e10cSrcweir 
1619cdf0e10cSrcweir         // additional fields are to be coded soon!   :-)
1620cdf0e10cSrcweir 
1621cdf0e10cSrcweir         static const sal_uInt16 nLangCnt = 4;
1622cdf0e10cSrcweir         static const sal_Char *aNameSet_26[nFldCnt][nLangCnt+1] =
1623cdf0e10cSrcweir         {
1624cdf0e10cSrcweir             {aName10, aName11, aName12, aName13, aName14},
1625cdf0e10cSrcweir             {aName20, aName21, aName22, aName23, aName24},
1626cdf0e10cSrcweir             {aName30, aName31, aName32, aName33, aName34},
1627cdf0e10cSrcweir             {aName40, aName41, aName42, aName43, aName44},
1628cdf0e10cSrcweir             {aName50, aName51, aName52, aName53, aName54}
1629cdf0e10cSrcweir         };
1630cdf0e10cSrcweir 
1631cdf0e10cSrcweir         bool bFldFound= false;
1632cdf0e10cSrcweir         sal_uInt16 nFIdx;
1633cdf0e10cSrcweir         for(sal_uInt16 nLIdx=1; !bFldFound && (nLangCnt > nLIdx); ++nLIdx)
1634cdf0e10cSrcweir         {
1635cdf0e10cSrcweir             for(nFIdx = 0;  !bFldFound && (nFldCnt  > nFIdx); ++nFIdx)
1636cdf0e10cSrcweir             {
1637cdf0e10cSrcweir                 if( aDocProperty.Equals( String( aNameSet_26[nFIdx][nLIdx],
1638cdf0e10cSrcweir                     RTL_TEXTENCODING_MS_1252 ) ) )
1639cdf0e10cSrcweir                 {
1640cdf0e10cSrcweir                     bFldFound = true;
1641cdf0e10cSrcweir                     pF->nId   = aNameSet_26[nFIdx][0][0];
1642cdf0e10cSrcweir                 }
1643cdf0e10cSrcweir             }
1644cdf0e10cSrcweir         }
1645cdf0e10cSrcweir 
1646cdf0e10cSrcweir         if( !bFldFound )
1647cdf0e10cSrcweir         {
1648cdf0e10cSrcweir /*
1649cdf0e10cSrcweir             SwUserFieldType aTmp( &rDoc, aDocProperty );
1650cdf0e10cSrcweir             aTmp.SetContent(GetFieldResult( pF ));
1651cdf0e10cSrcweir             SwUserField aUFld( (SwUserFieldType*)rDoc.InsertFldType( aTmp ));
1652cdf0e10cSrcweir             aUFld.ChangeFormat( UF_STRING );
1653cdf0e10cSrcweir             rDoc.Insert( *pPaM, SwFmtFld( aUFld ), 0);
1654cdf0e10cSrcweir */
1655cdf0e10cSrcweir             SwDocInfoField aFld( (SwDocInfoFieldType*)
1656cdf0e10cSrcweir                 rDoc.GetSysFldType( RES_DOCINFOFLD ), DI_CUSTOM|nReg, aDocProperty, GetFieldResult( pF ) );
1657cdf0e10cSrcweir             rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
1658cdf0e10cSrcweir 
1659cdf0e10cSrcweir             return FLD_OK;
1660cdf0e10cSrcweir         }
1661cdf0e10cSrcweir     }
1662cdf0e10cSrcweir 
1663cdf0e10cSrcweir     switch( pF->nId )
1664cdf0e10cSrcweir     {
1665cdf0e10cSrcweir         case 14:
1666cdf0e10cSrcweir             /* kann alle INFO-Vars!! */
1667cdf0e10cSrcweir             nSub = DI_KEYS;
1668cdf0e10cSrcweir             break;
1669cdf0e10cSrcweir         case 15:
1670cdf0e10cSrcweir             nSub = DI_TITEL;
1671cdf0e10cSrcweir             break;
1672cdf0e10cSrcweir         case 16:
1673cdf0e10cSrcweir             nSub = DI_THEMA;
1674cdf0e10cSrcweir             break;
1675cdf0e10cSrcweir         case 18:
1676cdf0e10cSrcweir             nSub = DI_KEYS;
1677cdf0e10cSrcweir             break;
1678cdf0e10cSrcweir         case 19:
1679cdf0e10cSrcweir             nSub = DI_COMMENT;
1680cdf0e10cSrcweir             break;
1681cdf0e10cSrcweir         case 20:
1682cdf0e10cSrcweir             nSub = DI_CHANGE;
1683cdf0e10cSrcweir             nReg = DI_SUB_AUTHOR;
1684cdf0e10cSrcweir             break;
1685cdf0e10cSrcweir         case 21:
1686cdf0e10cSrcweir             nSub = DI_CREATE;
1687cdf0e10cSrcweir             nReg = DI_SUB_DATE;
1688cdf0e10cSrcweir             bDateTime = true;
1689cdf0e10cSrcweir             break;
1690cdf0e10cSrcweir         case 23:
1691cdf0e10cSrcweir             nSub = DI_PRINT;
1692cdf0e10cSrcweir             nReg = DI_SUB_DATE;
1693cdf0e10cSrcweir             bDateTime = true;
1694cdf0e10cSrcweir             break;
1695cdf0e10cSrcweir         case 24:
1696cdf0e10cSrcweir             nSub = DI_DOCNO;
1697cdf0e10cSrcweir             break;
1698cdf0e10cSrcweir         case 22:
1699cdf0e10cSrcweir             nSub = DI_CHANGE;
1700cdf0e10cSrcweir             nReg = DI_SUB_DATE;
1701cdf0e10cSrcweir             bDateTime = true;
1702cdf0e10cSrcweir             break;
1703cdf0e10cSrcweir         case 25:
1704cdf0e10cSrcweir             nSub = DI_CHANGE;
1705cdf0e10cSrcweir             nReg = DI_SUB_TIME;
1706cdf0e10cSrcweir             bDateTime = true;
1707cdf0e10cSrcweir             break;
1708cdf0e10cSrcweir     }
1709cdf0e10cSrcweir 
1710cdf0e10cSrcweir     sal_uInt32 nFormat = 0;
1711cdf0e10cSrcweir 
1712cdf0e10cSrcweir     sal_uInt16 nLang(0);
1713cdf0e10cSrcweir     if (bDateTime)
1714cdf0e10cSrcweir     {
1715cdf0e10cSrcweir         short nDT = GetTimeDatePara(rStr, nFormat, nLang, pF->nId);
1716cdf0e10cSrcweir         switch (nDT)
1717cdf0e10cSrcweir         {
1718cdf0e10cSrcweir             case NUMBERFORMAT_DATE:
1719cdf0e10cSrcweir                 nReg = DI_SUB_DATE;
1720cdf0e10cSrcweir                 break;
1721cdf0e10cSrcweir             case NUMBERFORMAT_TIME:
1722cdf0e10cSrcweir                 nReg = DI_SUB_TIME;
1723cdf0e10cSrcweir                 break;
1724cdf0e10cSrcweir             case NUMBERFORMAT_DATETIME:
1725cdf0e10cSrcweir                 nReg = DI_SUB_DATE;
1726cdf0e10cSrcweir                 break;
1727cdf0e10cSrcweir             default:
1728cdf0e10cSrcweir                 nReg = DI_SUB_DATE;
1729cdf0e10cSrcweir                 break;
1730cdf0e10cSrcweir         }
1731cdf0e10cSrcweir     }
1732cdf0e10cSrcweir 
1733cdf0e10cSrcweir     SwDocInfoField aFld( (SwDocInfoFieldType*)
1734cdf0e10cSrcweir         rDoc.GetSysFldType( RES_DOCINFOFLD ), nSub|nReg, String(), nFormat );
1735cdf0e10cSrcweir     if (bDateTime)
1736cdf0e10cSrcweir         ForceFieldLanguage(aFld, nLang);
1737cdf0e10cSrcweir     rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
1738cdf0e10cSrcweir 
1739cdf0e10cSrcweir     return FLD_OK;
1740cdf0e10cSrcweir }
1741cdf0e10cSrcweir 
Read_F_Author(WW8FieldDesc *,String &)1742cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Author( WW8FieldDesc*, String& )
1743cdf0e10cSrcweir {
1744cdf0e10cSrcweir         // SH: Das SwAuthorField bezeichnet nicht den urspruenglichen
1745cdf0e10cSrcweir         // Autor, sondern den aktuellen Benutzer, also besser ueber DocInfo
1746cdf0e10cSrcweir         // (#56149)
1747cdf0e10cSrcweir     SwDocInfoField aFld( (SwDocInfoFieldType*)
1748cdf0e10cSrcweir                      rDoc.GetSysFldType( RES_DOCINFOFLD ),
1749cdf0e10cSrcweir                      DI_CREATE|DI_SUB_AUTHOR, String() );
1750cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1751cdf0e10cSrcweir     return FLD_OK;
1752cdf0e10cSrcweir }
1753cdf0e10cSrcweir 
Read_F_TemplName(WW8FieldDesc *,String &)1754cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_TemplName( WW8FieldDesc*, String& )
1755cdf0e10cSrcweir {
1756cdf0e10cSrcweir     SwTemplNameField aFld( (SwTemplNameFieldType*)
1757cdf0e10cSrcweir                      rDoc.GetSysFldType( RES_TEMPLNAMEFLD ), FF_NAME );
1758cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1759cdf0e10cSrcweir     return FLD_OK;
1760cdf0e10cSrcweir }
1761cdf0e10cSrcweir 
1762cdf0e10cSrcweir // Sowohl das Datum- wie auch das Uhrzeit-Feld kann fuer Datum, fuer Uhrzeit
1763cdf0e10cSrcweir // oder fuer beides benutzt werden.
Read_F_DateTime(WW8FieldDesc * pF,String & rStr)1764cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_DateTime( WW8FieldDesc*pF, String& rStr )
1765cdf0e10cSrcweir {
1766cdf0e10cSrcweir     bool bHijri = false;
1767cdf0e10cSrcweir     bool bSaka = false;
1768cdf0e10cSrcweir     _ReadFieldParams aReadParam(rStr);
1769cdf0e10cSrcweir     long nTok;
1770cdf0e10cSrcweir     while (-1 != (nTok = aReadParam.SkipToNextToken()))
1771cdf0e10cSrcweir     {
1772cdf0e10cSrcweir         switch (nTok)
1773cdf0e10cSrcweir         {
1774cdf0e10cSrcweir             default:
1775cdf0e10cSrcweir             case 'l':
1776cdf0e10cSrcweir             case -2:
1777cdf0e10cSrcweir                 break;
1778cdf0e10cSrcweir             case 'h':
1779cdf0e10cSrcweir                 bHijri = true;
1780cdf0e10cSrcweir                 break;
1781cdf0e10cSrcweir             case 's':
1782cdf0e10cSrcweir                 bSaka = true;
1783cdf0e10cSrcweir                 break;
1784cdf0e10cSrcweir         }
1785cdf0e10cSrcweir     }
1786cdf0e10cSrcweir 
1787cdf0e10cSrcweir     sal_uInt32 nFormat = 0;
1788cdf0e10cSrcweir 
1789cdf0e10cSrcweir     sal_uInt16 nLang(0);
1790cdf0e10cSrcweir     short nDT = GetTimeDatePara(rStr, nFormat, nLang, ww::eDATE, bHijri);
1791cdf0e10cSrcweir 
1792cdf0e10cSrcweir     if( NUMBERFORMAT_UNDEFINED == nDT )             // no D/T-Formatstring
1793cdf0e10cSrcweir     {
1794cdf0e10cSrcweir         if (32 == pF->nId)
1795cdf0e10cSrcweir         {
1796cdf0e10cSrcweir             nDT     = NUMBERFORMAT_TIME;
1797cdf0e10cSrcweir             nFormat = rDoc.GetNumberFormatter()->GetFormatIndex(
1798cdf0e10cSrcweir                         NF_TIME_START, LANGUAGE_SYSTEM );
1799cdf0e10cSrcweir         }
1800cdf0e10cSrcweir         else
1801cdf0e10cSrcweir         {
1802cdf0e10cSrcweir             nDT     = NUMBERFORMAT_DATE;
1803cdf0e10cSrcweir             nFormat = rDoc.GetNumberFormatter()->GetFormatIndex(
1804cdf0e10cSrcweir                         NF_DATE_START, LANGUAGE_SYSTEM );
1805cdf0e10cSrcweir         }
1806cdf0e10cSrcweir     }
1807cdf0e10cSrcweir 
1808cdf0e10cSrcweir     if (nDT & NUMBERFORMAT_DATE)
1809cdf0e10cSrcweir     {
1810cdf0e10cSrcweir         SwDateTimeField aFld((SwDateTimeFieldType*)
1811cdf0e10cSrcweir             rDoc.GetSysFldType(RES_DATETIMEFLD ), DATEFLD, nFormat);
1812cdf0e10cSrcweir         ForceFieldLanguage(aFld, nLang);
1813cdf0e10cSrcweir         rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1814cdf0e10cSrcweir     }
1815cdf0e10cSrcweir     else if (nDT == NUMBERFORMAT_TIME)
1816cdf0e10cSrcweir     {
1817cdf0e10cSrcweir         SwDateTimeField aFld((SwDateTimeFieldType*)
1818cdf0e10cSrcweir             rDoc.GetSysFldType(RES_DATETIMEFLD), TIMEFLD, nFormat);
1819cdf0e10cSrcweir         ForceFieldLanguage(aFld, nLang);
1820cdf0e10cSrcweir         rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1821cdf0e10cSrcweir     }
1822cdf0e10cSrcweir 
1823cdf0e10cSrcweir     return FLD_OK;
1824cdf0e10cSrcweir }
1825cdf0e10cSrcweir 
Read_F_FileName(WW8FieldDesc *,String & rStr)1826cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_FileName(WW8FieldDesc*, String &rStr)
1827cdf0e10cSrcweir {
1828cdf0e10cSrcweir     SwFileNameFormat eType = FF_NAME;
1829cdf0e10cSrcweir     long nRet;
1830cdf0e10cSrcweir     _ReadFieldParams aReadParam(rStr);
1831cdf0e10cSrcweir     while (-1 != (nRet = aReadParam.SkipToNextToken()))
1832cdf0e10cSrcweir     {
1833cdf0e10cSrcweir         switch (nRet)
1834cdf0e10cSrcweir         {
1835cdf0e10cSrcweir             case 'p':
1836cdf0e10cSrcweir                 eType = FF_PATHNAME;
1837cdf0e10cSrcweir                 break;
1838cdf0e10cSrcweir             case '*':
1839cdf0e10cSrcweir                 //Skip over MERGEFORMAT
1840cdf0e10cSrcweir                 aReadParam.SkipToNextToken();
1841cdf0e10cSrcweir                 break;
1842cdf0e10cSrcweir             default:
1843cdf0e10cSrcweir                 ASSERT(!this, "unknown option in FileName field");
1844cdf0e10cSrcweir                 break;
1845cdf0e10cSrcweir         }
1846cdf0e10cSrcweir     }
1847cdf0e10cSrcweir 
1848cdf0e10cSrcweir     SwFileNameField aFld(
1849cdf0e10cSrcweir         (SwFileNameFieldType*)rDoc.GetSysFldType(RES_FILENAMEFLD), eType);
1850cdf0e10cSrcweir     rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
1851cdf0e10cSrcweir     return FLD_OK;
1852cdf0e10cSrcweir }
1853cdf0e10cSrcweir 
Read_F_Anz(WW8FieldDesc * pF,String & rStr)1854cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Anz( WW8FieldDesc* pF, String& rStr )
1855cdf0e10cSrcweir {                                               // SeitenZahl - Feld
1856cdf0e10cSrcweir     sal_uInt16 nSub = DS_PAGE;
1857cdf0e10cSrcweir     switch ( pF->nId ){
1858cdf0e10cSrcweir     case 27: nSub = DS_WORD; break;             // Wordzahl
1859cdf0e10cSrcweir     case 28: nSub = DS_CHAR; break;             // Zeichenzahl
1860cdf0e10cSrcweir     }
1861cdf0e10cSrcweir     SwDocStatField aFld( (SwDocStatFieldType*)
1862cdf0e10cSrcweir                          rDoc.GetSysFldType( RES_DOCSTATFLD ), nSub,
1863cdf0e10cSrcweir                          GetNumberPara( rStr ) );
1864cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1865cdf0e10cSrcweir     return FLD_OK;
1866cdf0e10cSrcweir }
1867cdf0e10cSrcweir 
Read_F_CurPage(WW8FieldDesc *,String & rStr)1868cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_CurPage( WW8FieldDesc*, String& rStr )
1869cdf0e10cSrcweir {
1870cdf0e10cSrcweir     // zusaetzlich mit Kapitelnummer?
1871cdf0e10cSrcweir     if( bPgChpLevel )
1872cdf0e10cSrcweir     {
1873cdf0e10cSrcweir         SwChapterField aFld( (SwChapterFieldType*)
1874cdf0e10cSrcweir                     rDoc.GetSysFldType( RES_CHAPTERFLD ), CF_NUMBER );
1875cdf0e10cSrcweir         aFld.SetLevel( nPgChpLevel );
1876cdf0e10cSrcweir         rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1877cdf0e10cSrcweir 
1878cdf0e10cSrcweir         static const sal_Char aDelim[] = "-.:\x97\x96";
1879cdf0e10cSrcweir         sal_uInt8 nDelim = nPgChpDelim;
1880cdf0e10cSrcweir         if( nDelim > 4 )
1881cdf0e10cSrcweir             nDelim = 0;
1882cdf0e10cSrcweir 
1883cdf0e10cSrcweir         sal_Unicode c = ByteString::ConvertToUnicode( aDelim[ nDelim ],
1884cdf0e10cSrcweir                                         RTL_TEXTENCODING_MS_1252 );
1885cdf0e10cSrcweir         if( '-' == c )
1886cdf0e10cSrcweir         {
1887cdf0e10cSrcweir             rDoc.InsertString( *pPaM, CHAR_HARDHYPHEN );
1888cdf0e10cSrcweir         }
1889cdf0e10cSrcweir         else
1890cdf0e10cSrcweir         {
1891cdf0e10cSrcweir             rDoc.InsertString( *pPaM, c ); // maybe insert ZWNBSP?
1892cdf0e10cSrcweir         }
1893cdf0e10cSrcweir     }
1894cdf0e10cSrcweir 
1895cdf0e10cSrcweir     // Seitennummer
1896cdf0e10cSrcweir     SwPageNumberField aFld( (SwPageNumberFieldType*)
1897cdf0e10cSrcweir         rDoc.GetSysFldType( RES_PAGENUMBERFLD ), PG_RANDOM,
1898cdf0e10cSrcweir         GetNumberPara(rStr, true));
1899cdf0e10cSrcweir 
1900cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
1901cdf0e10cSrcweir     return FLD_OK;
1902cdf0e10cSrcweir }
1903cdf0e10cSrcweir 
Read_F_Symbol(WW8FieldDesc *,String & rStr)1904cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Symbol( WW8FieldDesc*, String& rStr )
1905cdf0e10cSrcweir {
1906cdf0e10cSrcweir     //e.g. #i20118#
1907cdf0e10cSrcweir     String aQ;
1908cdf0e10cSrcweir     String aName;
1909cdf0e10cSrcweir     sal_Int32 nSize = 0;
1910cdf0e10cSrcweir     long nRet;
1911cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
1912cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
1913cdf0e10cSrcweir     {
1914cdf0e10cSrcweir         switch( nRet )
1915cdf0e10cSrcweir         {
1916cdf0e10cSrcweir         case -2:
1917cdf0e10cSrcweir             if( !aQ.Len() )
1918cdf0e10cSrcweir                 aQ = aReadParam.GetResult();
1919cdf0e10cSrcweir             break;
1920cdf0e10cSrcweir         case 'f':
1921cdf0e10cSrcweir         case 'F':
1922cdf0e10cSrcweir             {
1923cdf0e10cSrcweir                 xub_StrLen n = aReadParam.GoToTokenParam();
1924cdf0e10cSrcweir                 if( STRING_NOTFOUND != n )
1925cdf0e10cSrcweir                     aName = aReadParam.GetResult();
1926cdf0e10cSrcweir             }
1927cdf0e10cSrcweir             break;
1928cdf0e10cSrcweir         case 's':
1929cdf0e10cSrcweir         case 'S':
1930cdf0e10cSrcweir             {
1931cdf0e10cSrcweir                 String aSiz;
1932cdf0e10cSrcweir                 xub_StrLen n = aReadParam.GoToTokenParam();
1933cdf0e10cSrcweir                 if (STRING_NOTFOUND != n)
1934cdf0e10cSrcweir                     aSiz = aReadParam.GetResult();
1935cdf0e10cSrcweir                 if (aSiz.Len())
1936cdf0e10cSrcweir                     nSize = aSiz.ToInt32() * 20; // pT -> twip
1937cdf0e10cSrcweir             }
1938cdf0e10cSrcweir             break;
1939cdf0e10cSrcweir         }
1940cdf0e10cSrcweir     }
1941cdf0e10cSrcweir     if( !aQ.Len() )
1942cdf0e10cSrcweir         return FLD_TAGIGN;                      // -> kein 0-Zeichen in Text
1943cdf0e10cSrcweir 
1944cdf0e10cSrcweir     if (sal_Unicode cChar = static_cast<sal_Unicode>(aQ.ToInt32()))
1945cdf0e10cSrcweir     {
1946cdf0e10cSrcweir         if (aName.Len())                           // Font Name set ?
1947cdf0e10cSrcweir         {
1948cdf0e10cSrcweir             SvxFontItem aFont(FAMILY_DONTKNOW, aName, aEmptyStr,
1949cdf0e10cSrcweir                 PITCH_DONTKNOW, RTL_TEXTENCODING_SYMBOL, RES_CHRATR_FONT);
1950cdf0e10cSrcweir             NewAttr(aFont);                       // new Font
1951cdf0e10cSrcweir         }
1952cdf0e10cSrcweir 
1953cdf0e10cSrcweir         if (nSize > 0)  //#i20118#
1954cdf0e10cSrcweir         {
1955cdf0e10cSrcweir             SvxFontHeightItem aSz(nSize, 100, RES_CHRATR_FONTSIZE);
1956cdf0e10cSrcweir             NewAttr(aSz);
1957cdf0e10cSrcweir         }
1958cdf0e10cSrcweir 
1959cdf0e10cSrcweir         rDoc.InsertString(*pPaM, cChar);
1960cdf0e10cSrcweir 
1961cdf0e10cSrcweir         if (nSize > 0)
1962cdf0e10cSrcweir             pCtrlStck->SetAttr(*pPaM->GetPoint(), RES_CHRATR_FONTSIZE);
1963cdf0e10cSrcweir         if (aName.Len())
1964cdf0e10cSrcweir             pCtrlStck->SetAttr(*pPaM->GetPoint(), RES_CHRATR_FONT);
1965cdf0e10cSrcweir     }
1966cdf0e10cSrcweir     else
1967cdf0e10cSrcweir     {
1968cdf0e10cSrcweir         rDoc.InsertString(*pPaM, CREATE_CONST_ASC("###"));
1969cdf0e10cSrcweir     }
1970cdf0e10cSrcweir 
1971cdf0e10cSrcweir     return FLD_OK;
1972cdf0e10cSrcweir }
1973cdf0e10cSrcweir 
1974cdf0e10cSrcweir // "EINBETTEN"
Read_F_Embedd(WW8FieldDesc *,String & rStr)1975cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Embedd( WW8FieldDesc*, String& rStr )
1976cdf0e10cSrcweir {
1977cdf0e10cSrcweir     String sHost;
1978cdf0e10cSrcweir 
1979cdf0e10cSrcweir     long nRet;
1980cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
1981cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
1982cdf0e10cSrcweir     {
1983cdf0e10cSrcweir         switch( nRet )
1984cdf0e10cSrcweir         {
1985cdf0e10cSrcweir         case -2:
1986cdf0e10cSrcweir             sHost = aReadParam.GetResult();
1987cdf0e10cSrcweir             break;
1988cdf0e10cSrcweir 
1989cdf0e10cSrcweir         case 's':
1990cdf0e10cSrcweir             // use ObjectSize
1991cdf0e10cSrcweir             break;
1992cdf0e10cSrcweir         }
1993cdf0e10cSrcweir     }
1994cdf0e10cSrcweir 
1995cdf0e10cSrcweir     if( bObj && nPicLocFc )
1996cdf0e10cSrcweir         nObjLocFc = nPicLocFc;
1997cdf0e10cSrcweir     bEmbeddObj = true;
1998cdf0e10cSrcweir     return FLD_TEXT;
1999cdf0e10cSrcweir }
2000cdf0e10cSrcweir 
2001cdf0e10cSrcweir 
2002cdf0e10cSrcweir // "SET"
Read_F_Set(WW8FieldDesc * pF,String & rStr)2003cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Set( WW8FieldDesc* pF, String& rStr )
2004cdf0e10cSrcweir {
2005cdf0e10cSrcweir     String sOrigName;
2006cdf0e10cSrcweir     String sVal;
2007cdf0e10cSrcweir     long nRet;
2008cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2009cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2010cdf0e10cSrcweir     {
2011cdf0e10cSrcweir         switch( nRet )
2012cdf0e10cSrcweir         {
2013cdf0e10cSrcweir         case -2:
2014cdf0e10cSrcweir             if( !sOrigName.Len() )
2015cdf0e10cSrcweir                 sOrigName = aReadParam.GetResult();
2016cdf0e10cSrcweir             else if( !sVal.Len() )
2017cdf0e10cSrcweir                 sVal = aReadParam.GetResult();
2018cdf0e10cSrcweir             break;
2019cdf0e10cSrcweir         }
2020cdf0e10cSrcweir     }
2021cdf0e10cSrcweir 
2022cdf0e10cSrcweir     long nNo = MapBookmarkVariables(pF,sOrigName,sVal);
2023cdf0e10cSrcweir 
2024cdf0e10cSrcweir     SwFieldType* pFT = rDoc.InsertFldType( SwSetExpFieldType( &rDoc, sOrigName,
2025cdf0e10cSrcweir         nsSwGetSetExpType::GSE_STRING ) );
2026cdf0e10cSrcweir     SwSetExpField aFld( (SwSetExpFieldType*)pFT, sVal, ULONG_MAX );
2027cdf0e10cSrcweir     aFld.SetSubType(nsSwExtendedSubType::SUB_INVISIBLE | nsSwGetSetExpType::GSE_STRING);
2028cdf0e10cSrcweir 
2029cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
2030cdf0e10cSrcweir 
2031cdf0e10cSrcweir     pReffedStck->SetAttr(*pPaM->GetPoint(), RES_FLTR_BOOKMARK, true, nNo);
2032cdf0e10cSrcweir 
2033cdf0e10cSrcweir     return FLD_OK;
2034cdf0e10cSrcweir }
2035cdf0e10cSrcweir 
2036cdf0e10cSrcweir // "REF"
Read_F_Ref(WW8FieldDesc *,String & rStr)2037cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Ref( WW8FieldDesc*, String& rStr )
2038cdf0e10cSrcweir {                                                       // Reference - Field
2039cdf0e10cSrcweir     String sOrigBkmName;
2040cdf0e10cSrcweir     bool bChapterNr = false;
2041cdf0e10cSrcweir     bool bAboveBelow = false;
2042cdf0e10cSrcweir 
2043cdf0e10cSrcweir     long nRet;
2044cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2045cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2046cdf0e10cSrcweir     {
2047cdf0e10cSrcweir         switch( nRet )
2048cdf0e10cSrcweir         {
2049cdf0e10cSrcweir         case -2:
2050cdf0e10cSrcweir             if( !sOrigBkmName.Len() ) // get name of bookmark
2051cdf0e10cSrcweir                 sOrigBkmName = aReadParam.GetResult();
2052cdf0e10cSrcweir             break;
2053cdf0e10cSrcweir         case 'n':
2054cdf0e10cSrcweir         case 'r':
2055cdf0e10cSrcweir         case 'w':
2056cdf0e10cSrcweir             bChapterNr = true; // activate flag 'Chapter Number'
2057cdf0e10cSrcweir             break;
2058cdf0e10cSrcweir 
2059cdf0e10cSrcweir         case 'p':
2060cdf0e10cSrcweir             bAboveBelow = true;
2061cdf0e10cSrcweir             break;
2062cdf0e10cSrcweir         case 'h':
2063cdf0e10cSrcweir             break;
2064cdf0e10cSrcweir         default:
2065cdf0e10cSrcweir             // unimplemented switch: just do 'nix nought nothing'  :-)
2066cdf0e10cSrcweir             break;
2067cdf0e10cSrcweir         }
2068cdf0e10cSrcweir     }
2069cdf0e10cSrcweir 
2070cdf0e10cSrcweir     String sBkmName(GetMappedBookmark(sOrigBkmName));
2071cdf0e10cSrcweir 
2072cdf0e10cSrcweir     if (!bAboveBelow || bChapterNr)
2073cdf0e10cSrcweir     {
2074cdf0e10cSrcweir         if (bChapterNr)
2075cdf0e10cSrcweir         {
2076cdf0e10cSrcweir             SwGetRefField aFld(
2077cdf0e10cSrcweir                 (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ),
2078cdf0e10cSrcweir                 sBkmName,REF_BOOKMARK,0,REF_CHAPTER);
2079cdf0e10cSrcweir             rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
2080cdf0e10cSrcweir         }
2081cdf0e10cSrcweir         else
2082cdf0e10cSrcweir         {
2083cdf0e10cSrcweir             /*
2084cdf0e10cSrcweir             If we are just inserting the contents of the bookmark, then it
2085cdf0e10cSrcweir             is possible that the bookmark is actually a variable, so we
2086cdf0e10cSrcweir             must store it until the end of the document to see if it was,
2087cdf0e10cSrcweir             in which case we'll turn it into a show variable
2088cdf0e10cSrcweir             */
2089cdf0e10cSrcweir             SwGetRefField aFld(
2090cdf0e10cSrcweir                 (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ),
2091cdf0e10cSrcweir                 sOrigBkmName,REF_BOOKMARK,0,REF_CONTENT);
2092cdf0e10cSrcweir             pReffingStck->NewAttr( *pPaM->GetPoint(), SwFmtFld(aFld) );
2093cdf0e10cSrcweir             pReffingStck->SetAttr( *pPaM->GetPoint(), RES_TXTATR_FIELD);
2094cdf0e10cSrcweir         }
2095cdf0e10cSrcweir     }
2096cdf0e10cSrcweir 
2097cdf0e10cSrcweir     if( bAboveBelow )
2098cdf0e10cSrcweir     {
2099cdf0e10cSrcweir         SwGetRefField aFld( (SwGetRefFieldType*)
2100cdf0e10cSrcweir             rDoc.GetSysFldType( RES_GETREFFLD ), sBkmName, REF_BOOKMARK, 0,
2101cdf0e10cSrcweir             REF_UPDOWN );
2102cdf0e10cSrcweir         rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
2103cdf0e10cSrcweir     }
2104cdf0e10cSrcweir     return FLD_OK;
2105cdf0e10cSrcweir }
2106cdf0e10cSrcweir 
2107cdf0e10cSrcweir // Note Reference - Field
Read_F_NoteReference(WW8FieldDesc *,String & rStr)2108cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_NoteReference( WW8FieldDesc*, String& rStr )
2109cdf0e10cSrcweir {
2110cdf0e10cSrcweir     String aBkmName;
2111cdf0e10cSrcweir     bool bChapterNr = false;
2112cdf0e10cSrcweir     bool bAboveBelow = false;
2113cdf0e10cSrcweir 
2114cdf0e10cSrcweir     long nRet;
2115cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2116cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2117cdf0e10cSrcweir     {
2118cdf0e10cSrcweir         switch( nRet )
2119cdf0e10cSrcweir         {
2120cdf0e10cSrcweir         case -2:
2121cdf0e10cSrcweir             if( !aBkmName.Len() ) // get name of foot/endnote
2122cdf0e10cSrcweir                 aBkmName = aReadParam.GetResult();
2123cdf0e10cSrcweir             break;
2124cdf0e10cSrcweir         case 'r':
2125cdf0e10cSrcweir             bChapterNr = true; // activate flag 'Chapter Number'
2126cdf0e10cSrcweir             break;
2127cdf0e10cSrcweir         case 'p':
2128cdf0e10cSrcweir             bAboveBelow = true;
2129cdf0e10cSrcweir             break;
2130cdf0e10cSrcweir         case 'h':
2131cdf0e10cSrcweir             break;
2132cdf0e10cSrcweir         default:
2133cdf0e10cSrcweir             // unimplemented switch: just do 'nix nought nothing'  :-)
2134cdf0e10cSrcweir             break;
2135cdf0e10cSrcweir         }
2136cdf0e10cSrcweir     }
2137cdf0e10cSrcweir 
2138cdf0e10cSrcweir     // set Sequence No of corresponding Foot-/Endnote to Zero
2139cdf0e10cSrcweir     // (will be corrected in
2140cdf0e10cSrcweir     SwGetRefField aFld( (SwGetRefFieldType*)
2141cdf0e10cSrcweir         rDoc.GetSysFldType( RES_GETREFFLD ), aBkmName, REF_FOOTNOTE, 0,
2142cdf0e10cSrcweir         REF_ONLYNUMBER );
2143cdf0e10cSrcweir     pReffingStck->NewAttr(*pPaM->GetPoint(), SwFmtFld(aFld));
2144cdf0e10cSrcweir     pReffingStck->SetAttr(*pPaM->GetPoint(), RES_TXTATR_FIELD);
2145cdf0e10cSrcweir     if (bAboveBelow)
2146cdf0e10cSrcweir     {
2147cdf0e10cSrcweir         SwGetRefField aFld2( (SwGetRefFieldType*)
2148cdf0e10cSrcweir             rDoc.GetSysFldType( RES_GETREFFLD ),aBkmName, REF_FOOTNOTE, 0,
2149cdf0e10cSrcweir             REF_UPDOWN );
2150cdf0e10cSrcweir         pReffingStck->NewAttr(*pPaM->GetPoint(), SwFmtFld(aFld2));
2151cdf0e10cSrcweir         pReffingStck->SetAttr(*pPaM->GetPoint(), RES_TXTATR_FIELD);
2152cdf0e10cSrcweir     }
2153cdf0e10cSrcweir     return FLD_OK;
2154cdf0e10cSrcweir }
2155cdf0e10cSrcweir 
2156cdf0e10cSrcweir // "SEITENREF"
Read_F_PgRef(WW8FieldDesc *,String & rStr)2157cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_PgRef( WW8FieldDesc*, String& rStr )
2158cdf0e10cSrcweir {
2159cdf0e10cSrcweir     String sOrigName;
2160cdf0e10cSrcweir     long nRet;
2161cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2162cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2163cdf0e10cSrcweir     {
2164f66c5aafSOliver-Rainer Wittmann         if ( nRet == -2 &&
2165f66c5aafSOliver-Rainer Wittmann              !sOrigName.Len() )
2166cdf0e10cSrcweir         {
2167f66c5aafSOliver-Rainer Wittmann             sOrigName = aReadParam.GetResult();
2168cdf0e10cSrcweir         }
2169cdf0e10cSrcweir     }
2170cdf0e10cSrcweir 
21713078b051SOliver-Rainer Wittmann     const String sName(GetMappedBookmark(sOrigName));
2172cdf0e10cSrcweir 
21733078b051SOliver-Rainer Wittmann     // loading page reference field in TOC
2174f66c5aafSOliver-Rainer Wittmann     if (mbLoadingTOCCache )
2175f66c5aafSOliver-Rainer Wittmann     {
21763078b051SOliver-Rainer Wittmann         // insert page ref representation as plain text --> return FLD_TEXT
21773078b051SOliver-Rainer Wittmann         // if there is no hyperlink settings for current toc and referenced bookmark is available,
21783078b051SOliver-Rainer Wittmann         // assign link to current ref area
21793078b051SOliver-Rainer Wittmann         if ( !mbLoadingTOCHyperlink && sName.Len() > 0 )
2180f66c5aafSOliver-Rainer Wittmann         {
21813078b051SOliver-Rainer Wittmann             // #120879# add cross reference bookmark name prefix, if it matches internal TOC bookmark naming convention
21823078b051SOliver-Rainer Wittmann             String sBookmarkName;
21833078b051SOliver-Rainer Wittmann             if ( IsTOCBookmarkName( sName ) )
21843078b051SOliver-Rainer Wittmann             {
21853078b051SOliver-Rainer Wittmann                 sBookmarkName = String( IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix() );
21863078b051SOliver-Rainer Wittmann                 sBookmarkName += sName;
21873078b051SOliver-Rainer Wittmann                 // track <sBookmarkName> as referenced TOC bookmark.
21883078b051SOliver-Rainer Wittmann                 pReffedStck->aReferencedTOCBookmarks.insert( sBookmarkName );
21893078b051SOliver-Rainer Wittmann             }
21903078b051SOliver-Rainer Wittmann             else
21913078b051SOliver-Rainer Wittmann             {
21923078b051SOliver-Rainer Wittmann                 sBookmarkName = sName;
21933078b051SOliver-Rainer Wittmann             }
21943078b051SOliver-Rainer Wittmann             String sURL = INET_MARK_TOKEN;
21953078b051SOliver-Rainer Wittmann             sURL += sBookmarkName;
21963078b051SOliver-Rainer Wittmann             const String sTarget;
2197f66c5aafSOliver-Rainer Wittmann             SwFmtINetFmt aURL( sURL, sTarget );
2198782a276cSOliver-Rainer Wittmann             const String sLinkStyle = String::CreateFromAscii("Index Link");
2199782a276cSOliver-Rainer Wittmann             const sal_uInt16 nPoolId =
2200f66c5aafSOliver-Rainer Wittmann                 SwStyleNameMapper::GetPoolIdFromUIName( sLinkStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
2201782a276cSOliver-Rainer Wittmann             aURL.SetVisitedFmtAndId( sLinkStyle, nPoolId);
2202782a276cSOliver-Rainer Wittmann             aURL.SetINetFmtAndId( sLinkStyle, nPoolId );
2203f66c5aafSOliver-Rainer Wittmann             pCtrlStck->NewAttr( *pPaM->GetPoint(), aURL );
2204f66c5aafSOliver-Rainer Wittmann         }
2205f66c5aafSOliver-Rainer Wittmann         return FLD_TEXT;
2206cdf0e10cSrcweir     }
2207cdf0e10cSrcweir 
22083078b051SOliver-Rainer Wittmann     // #120879# add cross reference bookmark name prefix, if it matches internal TOC bookmark naming convention
22093078b051SOliver-Rainer Wittmann     String sPageRefBookmarkName;
22103078b051SOliver-Rainer Wittmann     if ( IsTOCBookmarkName( sName ) )
22113078b051SOliver-Rainer Wittmann     {
22123078b051SOliver-Rainer Wittmann         sPageRefBookmarkName = IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix();
22133078b051SOliver-Rainer Wittmann         sPageRefBookmarkName += sName;
22143078b051SOliver-Rainer Wittmann         // track <sPageRefBookmarkName> as referenced TOC bookmark.
22153078b051SOliver-Rainer Wittmann         pReffedStck->aReferencedTOCBookmarks.insert( sPageRefBookmarkName );
22163078b051SOliver-Rainer Wittmann     }
22173078b051SOliver-Rainer Wittmann     else
22183078b051SOliver-Rainer Wittmann     {
22193078b051SOliver-Rainer Wittmann         sPageRefBookmarkName = sName;
22203078b051SOliver-Rainer Wittmann     }
22213078b051SOliver-Rainer Wittmann     SwGetRefField aFld( (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ),
22223078b051SOliver-Rainer Wittmann                         sPageRefBookmarkName, REF_BOOKMARK, 0, REF_PAGE );
2223cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
22243078b051SOliver-Rainer Wittmann 
2225cdf0e10cSrcweir     return FLD_OK;
2226cdf0e10cSrcweir }
2227b3e39f32SLei De Bin //helper function
2228b3e39f32SLei De Bin //For MS MacroButton field, the symbol in plain text is always "(" (0x28),
2229b3e39f32SLei De Bin //which should be mapped according to the macro type
ConvertMacroSymbol(const String & rName,String & rReference)2230b3e39f32SLei De Bin bool ConvertMacroSymbol( const String& rName, String& rReference )
2231b3e39f32SLei De Bin {
2232b3e39f32SLei De Bin 	bool bConverted = false;
2233b3e39f32SLei De Bin 	if( rReference.EqualsAscii( "(" ) )
2234b3e39f32SLei De Bin 	{
2235b3e39f32SLei De Bin 		bConverted = true;
2236f66c5aafSOliver-Rainer Wittmann 		sal_Unicode cSymbol = 0x0000;
2237b3e39f32SLei De Bin 		if( rName.EqualsAscii( "CheckIt" ) )
2238b3e39f32SLei De Bin 			cSymbol = 0xF06F;
2239b3e39f32SLei De Bin 		else if( rName.EqualsAscii( "UncheckIt" ) )
2240b3e39f32SLei De Bin 			cSymbol = 0xF0FE;
2241b3e39f32SLei De Bin 		else if( rName.EqualsAscii( "ShowExample" ) )
2242b3e39f32SLei De Bin 			cSymbol = 0xF02A;
2243b3e39f32SLei De Bin 		//else if... : todo
2244b3e39f32SLei De Bin 		else
2245b3e39f32SLei De Bin 			bConverted = false;
2246b3e39f32SLei De Bin 
2247b3e39f32SLei De Bin 		if( bConverted )
2248b3e39f32SLei De Bin 			rReference = cSymbol;
2249b3e39f32SLei De Bin 	}
2250b3e39f32SLei De Bin 	return bConverted;
2251b3e39f32SLei De Bin }
2252b3e39f32SLei De Bin //end
2253cdf0e10cSrcweir 
2254cdf0e10cSrcweir // "MACROSCHALTFL"ACHE"
Read_F_Macro(WW8FieldDesc *,String & rStr)2255cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Macro( WW8FieldDesc*, String& rStr)
2256cdf0e10cSrcweir {
2257cdf0e10cSrcweir     String aName;
2258cdf0e10cSrcweir     String aVText;
2259cdf0e10cSrcweir     long nRet;
2260cdf0e10cSrcweir     bool bNewVText = true;
2261cdf0e10cSrcweir     bool bBracket  = false;
2262cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2263cdf0e10cSrcweir 
2264cdf0e10cSrcweir     xub_StrLen nOffset = 0;
2265cdf0e10cSrcweir 
2266cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2267cdf0e10cSrcweir     {
2268cdf0e10cSrcweir         switch( nRet )
2269cdf0e10cSrcweir         {
2270cdf0e10cSrcweir         case -2:
2271cdf0e10cSrcweir             if( !aName.Len() )
2272cdf0e10cSrcweir                 aName = aReadParam.GetResult();
2273cdf0e10cSrcweir             else if( !aVText.Len() || bBracket )
2274cdf0e10cSrcweir             {
2275cdf0e10cSrcweir                 nOffset = aReadParam.GetTokenSttPtr() + 1;
2276cdf0e10cSrcweir 
2277cdf0e10cSrcweir                 if( bBracket )
2278cdf0e10cSrcweir                     aVText += ' ';
2279cdf0e10cSrcweir                 aVText += aReadParam.GetResult();
2280cdf0e10cSrcweir                 if (bNewVText)
2281cdf0e10cSrcweir                 {
2282cdf0e10cSrcweir                     bBracket = aVText.EqualsIgnoreCaseAscii('[', 1, 0)
2283cdf0e10cSrcweir                         ? true : false;
2284cdf0e10cSrcweir                     bNewVText = false;
2285cdf0e10cSrcweir                 }
2286cdf0e10cSrcweir                 else if( aVText.GetChar( aVText.Len()-1 ) == ']' )
2287cdf0e10cSrcweir                     bBracket  = false;
2288cdf0e10cSrcweir             }
2289cdf0e10cSrcweir             break;
2290cdf0e10cSrcweir         }
2291cdf0e10cSrcweir     }
2292cdf0e10cSrcweir     if( !aName.Len() )
2293cdf0e10cSrcweir         return FLD_TAGIGN;  // makes no sense without Makro-Name
2294cdf0e10cSrcweir 
2295b3e39f32SLei De Bin 	//try converting macro symbol according to macro name
2296b3e39f32SLei De Bin 	bool bApplyWingdings = ConvertMacroSymbol( aName, aVText );
2297cdf0e10cSrcweir     aName.InsertAscii( "StarOffice.Standard.Modul1.", 0 );
2298cdf0e10cSrcweir 
2299cdf0e10cSrcweir     SwMacroField aFld( (SwMacroFieldType*)
2300cdf0e10cSrcweir                     rDoc.GetSysFldType( RES_MACROFLD ), aName, aVText );
2301cdf0e10cSrcweir 
2302b3e39f32SLei De Bin 	if( !bApplyWingdings )
2303b3e39f32SLei De Bin 	{
2304b3e39f32SLei De Bin 
2305b3e39f32SLei De Bin 		rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
2306b3e39f32SLei De Bin 		WW8_CP nOldCp = pPlcxMan->Where();
2307b3e39f32SLei De Bin 		WW8_CP nCp = nOldCp + nOffset;
2308b3e39f32SLei De Bin 
2309b3e39f32SLei De Bin 		SwPaM aPaM(*pPaM);
2310b3e39f32SLei De Bin 		aPaM.SetMark();
2311b3e39f32SLei De Bin 		aPaM.Move(fnMoveBackward);
2312b3e39f32SLei De Bin 		aPaM.Exchange();
2313b3e39f32SLei De Bin 
2314b3e39f32SLei De Bin 		mpPostProcessAttrsInfo = new WW8PostProcessAttrsInfo(nCp, nCp, aPaM);
2315b3e39f32SLei De Bin 	}
2316b3e39f32SLei De Bin 	else
2317b3e39f32SLei De Bin 	{
2318b3e39f32SLei De Bin 		//set Wingdings font
2319b3e39f32SLei De Bin 		sal_uInt16 i = 0;
2320b3e39f32SLei De Bin 		for ( ; i < pFonts->GetMax(); i++ )
2321b3e39f32SLei De Bin 		{
2322b3e39f32SLei De Bin 			FontFamily eFamily;
2323b3e39f32SLei De Bin 			String aFontName;
2324b3e39f32SLei De Bin 			FontPitch ePitch;
2325b3e39f32SLei De Bin 			CharSet eSrcCharSet;
2326b3e39f32SLei De Bin 			if( GetFontParams( i, eFamily, aFontName, ePitch, eSrcCharSet )
2327b3e39f32SLei De Bin 				&& aFontName.EqualsAscii("Wingdings") )
2328b3e39f32SLei De Bin 			{
2329b3e39f32SLei De Bin 				break;
2330b3e39f32SLei De Bin 			}
2331b3e39f32SLei De Bin 		}
2332b3e39f32SLei De Bin 
2333b3e39f32SLei De Bin 		if ( i < pFonts->GetMax() )
2334b3e39f32SLei De Bin 		{
2335b3e39f32SLei De Bin 
2336b3e39f32SLei De Bin 			SetNewFontAttr( i, true, RES_CHRATR_FONT );
2337b3e39f32SLei De Bin 			rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
2338b3e39f32SLei De Bin 			pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_CHRATR_FONT );
2339b3e39f32SLei De Bin 			ResetCharSetVars();
2340b3e39f32SLei De Bin 		}
2341b3e39f32SLei De Bin 	}
2342cdf0e10cSrcweir 
2343cdf0e10cSrcweir     return FLD_OK;
2344cdf0e10cSrcweir }
2345cdf0e10cSrcweir 
WW8PostProcessAttrsInfo(WW8_CP nCpStart,WW8_CP nCpEnd,SwPaM & rPaM)2346cdf0e10cSrcweir WW8PostProcessAttrsInfo::WW8PostProcessAttrsInfo(WW8_CP nCpStart, WW8_CP nCpEnd,
2347cdf0e10cSrcweir                                                  SwPaM & rPaM)
2348cdf0e10cSrcweir : mbCopy(false),
2349cdf0e10cSrcweir   mnCpStart(nCpStart),
2350cdf0e10cSrcweir   mnCpEnd(nCpEnd),
2351cdf0e10cSrcweir   mPaM(*rPaM.GetPoint(), *rPaM.GetMark()),
2352cdf0e10cSrcweir   mItemSet(rPaM.GetDoc()->GetAttrPool(), RES_CHRATR_BEGIN, RES_PARATR_END - 1)
2353cdf0e10cSrcweir {
2354cdf0e10cSrcweir }
2355cdf0e10cSrcweir 
CanUseRemoteLink(const String & rGrfName)2356cdf0e10cSrcweir bool CanUseRemoteLink(const String &rGrfName)
2357cdf0e10cSrcweir {
2358cdf0e10cSrcweir     bool bUseRemote = false;
2359cdf0e10cSrcweir     try
2360cdf0e10cSrcweir     {
2361cdf0e10cSrcweir         ::ucbhelper::Content aCnt(rGrfName,
2362cdf0e10cSrcweir             uno::Reference<
2363cdf0e10cSrcweir             ucb::XCommandEnvironment >() );
2364cdf0e10cSrcweir         rtl::OUString   aTitle;
2365cdf0e10cSrcweir 
2366cdf0e10cSrcweir         aCnt.getPropertyValue(rtl::OUString::createFromAscii("Title" ))
2367cdf0e10cSrcweir             >>= aTitle;
2368cdf0e10cSrcweir         bUseRemote = (aTitle.getLength() > 0);
2369cdf0e10cSrcweir     }
2370cdf0e10cSrcweir     catch ( ... )
2371cdf0e10cSrcweir     {
2372cdf0e10cSrcweir         // this file did not exist, so we will not set this as graphiclink
2373cdf0e10cSrcweir         bUseRemote = false;
2374cdf0e10cSrcweir     }
2375cdf0e10cSrcweir     return bUseRemote;
2376cdf0e10cSrcweir }
2377cdf0e10cSrcweir 
2378cdf0e10cSrcweir // "EINF"UGENGRAFIK"
Read_F_IncludePicture(WW8FieldDesc *,String & rStr)2379cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_IncludePicture( WW8FieldDesc*, String& rStr )
2380cdf0e10cSrcweir {
2381cdf0e10cSrcweir     String aGrfName;
2382cdf0e10cSrcweir     bool bEmbedded = true;
2383cdf0e10cSrcweir 
2384cdf0e10cSrcweir     long nRet;
2385cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2386cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2387cdf0e10cSrcweir     {
2388cdf0e10cSrcweir         switch( nRet )
2389cdf0e10cSrcweir         {
2390cdf0e10cSrcweir         case -2:
2391cdf0e10cSrcweir             if (!aGrfName.Len())
2392cdf0e10cSrcweir                 ConvertFFileName(aGrfName, aReadParam.GetResult());
2393cdf0e10cSrcweir             break;
2394cdf0e10cSrcweir 
2395cdf0e10cSrcweir         case 'd':
2396cdf0e10cSrcweir             bEmbedded = false;          // Embedded-Flag deaktivieren
2397cdf0e10cSrcweir             break;
2398cdf0e10cSrcweir 
2399cdf0e10cSrcweir         case 'c':// den Converter-Namen ueberlesen
2400cdf0e10cSrcweir             aReadParam.FindNextStringPiece();
2401cdf0e10cSrcweir             break;
2402cdf0e10cSrcweir         }
2403cdf0e10cSrcweir     }
2404cdf0e10cSrcweir 
2405cdf0e10cSrcweir     if (!bEmbedded)
2406cdf0e10cSrcweir         bEmbedded = !CanUseRemoteLink(aGrfName);
2407cdf0e10cSrcweir 
2408cdf0e10cSrcweir     if (!bEmbedded)
2409cdf0e10cSrcweir     {
2410cdf0e10cSrcweir         /*
2411cdf0e10cSrcweir             Besonderheit:
2412cdf0e10cSrcweir 
2413cdf0e10cSrcweir             Wir setzen jetzt den Link ins Doc und merken uns den SwFlyFrmFmt.
2414cdf0e10cSrcweir             Da wir ja unten auf jjeden Fall mit Return-Wert FLD_READ_FSPA enden,
2415cdf0e10cSrcweir             wird der Skip-Wert so bemessen, dass das folgende Char-1 eingelesen
2416cdf0e10cSrcweir             wird.
2417cdf0e10cSrcweir             Wenn wir dann in SwWW8ImplReader::ImportGraf() reinlaufen, wird
2418cdf0e10cSrcweir             erkannt, dass wir soeben einen Grafik-Link inserted haben und
2419cdf0e10cSrcweir             das passende SwAttrSet wird ins Frame-Format eingesetzt.
2420cdf0e10cSrcweir         */
2421cdf0e10cSrcweir         SfxItemSet aFlySet( rDoc.GetAttrPool(), RES_FRMATR_BEGIN,
2422cdf0e10cSrcweir             RES_FRMATR_END-1 );
2423cdf0e10cSrcweir         aFlySet.Put( SwFmtAnchor( FLY_AS_CHAR ) );
2424cdf0e10cSrcweir         aFlySet.Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ));
2425cdf0e10cSrcweir         pFlyFmtOfJustInsertedGraphic = rDoc.Insert( *pPaM,
2426cdf0e10cSrcweir                                                     aGrfName,
2427cdf0e10cSrcweir                                                     aEmptyStr,
2428cdf0e10cSrcweir                                                     0,          // Graphic*
2429cdf0e10cSrcweir                                                     &aFlySet,
2430cdf0e10cSrcweir                                                     0, 0);         // SwFrmFmt*
2431cdf0e10cSrcweir         maGrfNameGenerator.SetUniqueGraphName(pFlyFmtOfJustInsertedGraphic,
2432cdf0e10cSrcweir             INetURLObject(aGrfName).GetBase());
2433cdf0e10cSrcweir     }
2434cdf0e10cSrcweir     return FLD_READ_FSPA;
2435cdf0e10cSrcweir }
2436cdf0e10cSrcweir 
2437cdf0e10cSrcweir 
UniqueName()2438cdf0e10cSrcweir String wwSectionNamer::UniqueName()
2439cdf0e10cSrcweir {
2440cdf0e10cSrcweir     String aName(msFileLinkSeed);
2441cdf0e10cSrcweir     aName += String::CreateFromInt32(++mnFileSectionNo);
2442cdf0e10cSrcweir     return mrDoc.GetUniqueSectionName(&aName);
2443cdf0e10cSrcweir }
2444cdf0e10cSrcweir 
2445cdf0e10cSrcweir // "EINFUEGENTEXT"
Read_F_IncludeText(WW8FieldDesc *,String & rStr)2446cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_IncludeText( WW8FieldDesc* /*pF*/, String& rStr )
2447cdf0e10cSrcweir {
2448cdf0e10cSrcweir     String aPara;
2449cdf0e10cSrcweir     String aBook;
2450cdf0e10cSrcweir     long nRet;
2451cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2452cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2453cdf0e10cSrcweir     {
2454cdf0e10cSrcweir         switch( nRet )
2455cdf0e10cSrcweir         {
2456cdf0e10cSrcweir             case -2:
2457cdf0e10cSrcweir                 if( !aPara.Len() )
2458cdf0e10cSrcweir                     aPara = aReadParam.GetResult();
2459cdf0e10cSrcweir                 else if( !aBook.Len() )
2460cdf0e10cSrcweir                     aBook = aReadParam.GetResult();
2461cdf0e10cSrcweir                 break;
2462cdf0e10cSrcweir             case '*':
2463cdf0e10cSrcweir                 //Skip over MERGEFORMAT
2464cdf0e10cSrcweir                 aReadParam.SkipToNextToken();
2465cdf0e10cSrcweir                 break;
2466cdf0e10cSrcweir         }
2467cdf0e10cSrcweir     }
2468cdf0e10cSrcweir     ConvertFFileName(aPara, aPara);
2469cdf0e10cSrcweir 
2470cdf0e10cSrcweir     if (aBook.Len() && aBook.GetChar( 0 ) != '\\')
2471cdf0e10cSrcweir     {
2472cdf0e10cSrcweir         // Bereich aus Quelle ( kein Switch ) ?
2473cdf0e10cSrcweir         ConvertUFName(aBook);
2474cdf0e10cSrcweir         aPara += sfx2::cTokenSeperator;
2475cdf0e10cSrcweir         aPara += sfx2::cTokenSeperator;
2476cdf0e10cSrcweir         aPara += aBook;
2477cdf0e10cSrcweir     }
2478cdf0e10cSrcweir 
2479cdf0e10cSrcweir     /*
2480cdf0e10cSrcweir     ##509##
2481cdf0e10cSrcweir     What we will do is insert a section to be linked to a file, but just in
2482cdf0e10cSrcweir     case the file is not available we will fill in the section with the stored
2483cdf0e10cSrcweir     content of this winword field as a fallback.
2484cdf0e10cSrcweir     */
2485cdf0e10cSrcweir     SwPosition aTmpPos(*pPaM->GetPoint());
2486cdf0e10cSrcweir 
2487cdf0e10cSrcweir     SwSectionData aSection(FILE_LINK_SECTION,
2488cdf0e10cSrcweir             maSectionNameGenerator.UniqueName());
2489cdf0e10cSrcweir     aSection.SetLinkFileName( aPara );
2490cdf0e10cSrcweir     aSection.SetProtectFlag(true);
2491cdf0e10cSrcweir 
2492cdf0e10cSrcweir     SwSection *const pSection =
2493cdf0e10cSrcweir         rDoc.InsertSwSection(*pPaM, aSection, 0, 0, false);
2494cdf0e10cSrcweir     ASSERT(pSection, "no section inserted");
2495cdf0e10cSrcweir     if (!pSection)
2496cdf0e10cSrcweir         return FLD_TEXT;
2497cdf0e10cSrcweir     const SwSectionNode* pSectionNode = pSection->GetFmt()->GetSectionNode();
2498cdf0e10cSrcweir     ASSERT(pSectionNode, "no section node!");
2499cdf0e10cSrcweir     if (!pSectionNode)
2500cdf0e10cSrcweir         return FLD_TEXT;
2501cdf0e10cSrcweir 
2502cdf0e10cSrcweir     pPaM->GetPoint()->nNode = pSectionNode->GetIndex()+1;
2503cdf0e10cSrcweir     pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0 );
2504cdf0e10cSrcweir 
2505cdf0e10cSrcweir     //we have inserted a section before this point, so adjust pos
2506cdf0e10cSrcweir     //for future page/section segment insertion
2507cdf0e10cSrcweir     maSectionManager.PrependedInlineNode(aTmpPos, *pPaM->GetNode());
2508cdf0e10cSrcweir 
2509cdf0e10cSrcweir     return FLD_TEXT;
2510cdf0e10cSrcweir }
2511cdf0e10cSrcweir 
2512cdf0e10cSrcweir // "SERIENDRUCKFELD"
Read_F_DBField(WW8FieldDesc * pF,String & rStr)2513cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_DBField( WW8FieldDesc* pF, String& rStr )
2514cdf0e10cSrcweir {
2515cdf0e10cSrcweir     String aName;
2516cdf0e10cSrcweir     long nRet;
2517cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2518cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
2519cdf0e10cSrcweir     {
2520cdf0e10cSrcweir         switch( nRet )
2521cdf0e10cSrcweir         {
2522cdf0e10cSrcweir         case -2:
2523cdf0e10cSrcweir             if( !aName.Len() )
2524cdf0e10cSrcweir                 aName = aReadParam.GetResult();
2525cdf0e10cSrcweir             break;
2526cdf0e10cSrcweir         }
2527cdf0e10cSrcweir     }
2528cdf0e10cSrcweir     SwDBFieldType aD( &rDoc, aName, SwDBData() );   // Datenbank: Nichts
2529cdf0e10cSrcweir 
2530cdf0e10cSrcweir     SwFieldType* pFT = rDoc.InsertFldType( aD );
2531cdf0e10cSrcweir     SwDBField aFld( (SwDBFieldType*)pFT );
2532cdf0e10cSrcweir     aFld.SetFieldCode( rStr );
2533cdf0e10cSrcweir 
2534cdf0e10cSrcweir     String aResult;
2535cdf0e10cSrcweir     pSBase->WW8ReadString( *pStrm, aResult, pPlcxMan->GetCpOfs()+
2536cdf0e10cSrcweir                            pF->nSRes, pF->nLRes, eTextCharSet );
2537cdf0e10cSrcweir 
2538cdf0e10cSrcweir     aFld.InitContent(aResult);
2539cdf0e10cSrcweir 
2540cdf0e10cSrcweir     rDoc.InsertPoolItem(*pPaM, SwFmtFld( aFld ), 0);
2541cdf0e10cSrcweir 
2542cdf0e10cSrcweir     return FLD_OK;
2543cdf0e10cSrcweir }
2544cdf0e10cSrcweir 
2545cdf0e10cSrcweir // "N"ACHSTER"
Read_F_DBNext(WW8FieldDesc *,String &)2546cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_DBNext( WW8FieldDesc*, String& )
2547cdf0e10cSrcweir {
2548cdf0e10cSrcweir     SwDBNextSetFieldType aN;
2549cdf0e10cSrcweir     SwFieldType* pFT = rDoc.InsertFldType( aN );
2550cdf0e10cSrcweir     SwDBNextSetField aFld( (SwDBNextSetFieldType*)pFT, aEmptyStr, aEmptyStr,
2551cdf0e10cSrcweir                             SwDBData() );       // Datenbank: Nichts
2552cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
2553cdf0e10cSrcweir     return FLD_OK;
2554cdf0e10cSrcweir }
2555cdf0e10cSrcweir 
2556cdf0e10cSrcweir // "DATENSATZ"
Read_F_DBNum(WW8FieldDesc *,String &)2557cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_DBNum( WW8FieldDesc*, String& )
2558cdf0e10cSrcweir {
2559cdf0e10cSrcweir     SwDBSetNumberFieldType aN;
2560cdf0e10cSrcweir     SwFieldType* pFT = rDoc.InsertFldType( aN );
2561cdf0e10cSrcweir     SwDBSetNumberField aFld( (SwDBSetNumberFieldType*)pFT,
2562cdf0e10cSrcweir                            SwDBData() );            // Datenbank: Nichts
2563cdf0e10cSrcweir     rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 );
2564cdf0e10cSrcweir     return FLD_OK;
2565cdf0e10cSrcweir }
2566cdf0e10cSrcweir 
2567cdf0e10cSrcweir /*
2568cdf0e10cSrcweir     EQ , only the usage for
2569cdf0e10cSrcweir     a. Combined Characters supported, must be exactly in the form that word
2570cdf0e10cSrcweir     only accepts as combined charactersm, i.e.
2571cdf0e10cSrcweir     eq \o(\s\up Y(XXX),\s\do Y(XXX))
2572cdf0e10cSrcweir     b. Ruby Text supported, must be in the form that word recognizes as being
2573cdf0e10cSrcweir     ruby text
2574cdf0e10cSrcweir     ...
2575cdf0e10cSrcweir */
Read_F_Equation(WW8FieldDesc *,String & rStr)2576cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Equation( WW8FieldDesc*, String& rStr )
2577cdf0e10cSrcweir {
2578cdf0e10cSrcweir     _ReadFieldParams aReadParam( rStr );
2579cdf0e10cSrcweir     long cChar = aReadParam.SkipToNextToken();
2580bc1ee56aSOliver-Rainer Wittmann     if ('o' == cChar || 'O' == cChar)
2581cdf0e10cSrcweir         Read_SubF_Combined(aReadParam);
2582cdf0e10cSrcweir     else if ('*' == cChar)
2583cdf0e10cSrcweir         Read_SubF_Ruby(aReadParam);
2584cdf0e10cSrcweir     return FLD_OK;
2585cdf0e10cSrcweir }
2586cdf0e10cSrcweir 
Read_SubF_Combined(_ReadFieldParams & rReadParam)2587cdf0e10cSrcweir void SwWW8ImplReader::Read_SubF_Combined( _ReadFieldParams& rReadParam)
2588cdf0e10cSrcweir {
2589cdf0e10cSrcweir     String sCombinedCharacters;
2590bc1ee56aSOliver-Rainer Wittmann     _ReadFieldParams aOriFldParam = rReadParam;
2591bc1ee56aSOliver-Rainer Wittmann     long cGetChar = rReadParam.SkipToNextToken();
2592bc1ee56aSOliver-Rainer Wittmann     switch( cGetChar )
2593cdf0e10cSrcweir     {
2594bc1ee56aSOliver-Rainer Wittmann     case 'a':
2595bc1ee56aSOliver-Rainer Wittmann     case 'A':
2596cdf0e10cSrcweir         {
2597bc1ee56aSOliver-Rainer Wittmann             String sTemp = rReadParam.GetResult();
2598bc1ee56aSOliver-Rainer Wittmann             if ( !sTemp.EqualsIgnoreCaseAscii("d", 1, 0) )
2599cdf0e10cSrcweir             {
2600bc1ee56aSOliver-Rainer Wittmann                 break;
2601bc1ee56aSOliver-Rainer Wittmann             }
2602bc1ee56aSOliver-Rainer Wittmann             rReadParam.SkipToNextToken();
2603bc1ee56aSOliver-Rainer Wittmann         }
2604bc1ee56aSOliver-Rainer Wittmann     case -2:
2605bc1ee56aSOliver-Rainer Wittmann         {
2606bc1ee56aSOliver-Rainer Wittmann             if ( rReadParam.GetResult().EqualsIgnoreCaseAscii('(', 1, 0) )
2607bc1ee56aSOliver-Rainer Wittmann             {
2608bc1ee56aSOliver-Rainer Wittmann                 for (int i=0;i<2;i++)
2609cdf0e10cSrcweir                 {
2610bc1ee56aSOliver-Rainer Wittmann                     if ('s' == rReadParam.SkipToNextToken())
2611cdf0e10cSrcweir                     {
2612bc1ee56aSOliver-Rainer Wittmann                         long cChar = rReadParam.SkipToNextToken();
2613bc1ee56aSOliver-Rainer Wittmann                         if (-2 != rReadParam.SkipToNextToken())
2614bc1ee56aSOliver-Rainer Wittmann                             break;
2615bc1ee56aSOliver-Rainer Wittmann                         String sF = rReadParam.GetResult();
2616bc1ee56aSOliver-Rainer Wittmann                         if ((('u' == cChar) && sF.EqualsIgnoreCaseAscii('p', 1, 0))
2617bc1ee56aSOliver-Rainer Wittmann                             || (('d' == cChar) && sF.EqualsIgnoreCaseAscii('o', 1, 0)))
2618cdf0e10cSrcweir                         {
2619bc1ee56aSOliver-Rainer Wittmann                             if (-2 == rReadParam.SkipToNextToken())
2620bc1ee56aSOliver-Rainer Wittmann                             {
2621bc1ee56aSOliver-Rainer Wittmann                                 String sPart = rReadParam.GetResult();
2622bc1ee56aSOliver-Rainer Wittmann                                 xub_StrLen nBegin = sPart.Search('(');
2623bc1ee56aSOliver-Rainer Wittmann 
2624bc1ee56aSOliver-Rainer Wittmann                                 //Word disallows brackets in this field, which
2625bc1ee56aSOliver-Rainer Wittmann                                 //aids figuring out the case of an end of )) vs )
2626bc1ee56aSOliver-Rainer Wittmann                                 xub_StrLen nEnd = sPart.Search(')');
2627bc1ee56aSOliver-Rainer Wittmann 
2628bc1ee56aSOliver-Rainer Wittmann                                 if ((nBegin != STRING_NOTFOUND) &&
2629bc1ee56aSOliver-Rainer Wittmann                                     (nEnd != STRING_NOTFOUND))
2630bc1ee56aSOliver-Rainer Wittmann                                 {
2631bc1ee56aSOliver-Rainer Wittmann                                     sCombinedCharacters +=
2632bc1ee56aSOliver-Rainer Wittmann                                         sPart.Copy(nBegin+1,nEnd-nBegin-1);
2633bc1ee56aSOliver-Rainer Wittmann                                 }
2634bc1ee56aSOliver-Rainer Wittmann                             }
2635bc1ee56aSOliver-Rainer Wittmann                         }
2636bc1ee56aSOliver-Rainer Wittmann                     }
2637bc1ee56aSOliver-Rainer Wittmann                 }
2638bc1ee56aSOliver-Rainer Wittmann                 if (sCombinedCharacters.Len())
2639bc1ee56aSOliver-Rainer Wittmann                 {
2640bc1ee56aSOliver-Rainer Wittmann                     SwCombinedCharField aFld((SwCombinedCharFieldType*)
2641bc1ee56aSOliver-Rainer Wittmann                         rDoc.GetSysFldType(RES_COMBINED_CHARS),sCombinedCharacters);
2642bc1ee56aSOliver-Rainer Wittmann                     rDoc.InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
2643bc1ee56aSOliver-Rainer Wittmann                 }
2644bc1ee56aSOliver-Rainer Wittmann                 else
2645bc1ee56aSOliver-Rainer Wittmann                 {
2646bc1ee56aSOliver-Rainer Wittmann                     const String sPart = aOriFldParam.GetResult();
2647bc1ee56aSOliver-Rainer Wittmann                     xub_StrLen nBegin = sPart.Search('(');
2648bc1ee56aSOliver-Rainer Wittmann                     xub_StrLen nEnd = sPart.Search(',');
2649bc1ee56aSOliver-Rainer Wittmann                     if ( nEnd == STRING_NOTFOUND )
2650bc1ee56aSOliver-Rainer Wittmann                     {
2651bc1ee56aSOliver-Rainer Wittmann                         nEnd = sPart.Search(')');
2652bc1ee56aSOliver-Rainer Wittmann                     }
2653bc1ee56aSOliver-Rainer Wittmann                     if ( (nBegin != STRING_NOTFOUND) && (nEnd != STRING_NOTFOUND) )
2654bc1ee56aSOliver-Rainer Wittmann                     {
2655bc1ee56aSOliver-Rainer Wittmann                         // skip certain leading characters
2656bc1ee56aSOliver-Rainer Wittmann                         for (int i = nBegin;i < nEnd-1;i++)
2657bc1ee56aSOliver-Rainer Wittmann                         {
2658bc1ee56aSOliver-Rainer Wittmann                             const sal_Unicode cC = sPart.GetChar(nBegin+1);
2659dffd5be7SOliver-Rainer Wittmann                             if ( cC < 32 )
2660bc1ee56aSOliver-Rainer Wittmann                             {
2661bc1ee56aSOliver-Rainer Wittmann                                 nBegin++;
2662bc1ee56aSOliver-Rainer Wittmann                             }
2663bc1ee56aSOliver-Rainer Wittmann                             else
2664bc1ee56aSOliver-Rainer Wittmann                                 break;
2665bc1ee56aSOliver-Rainer Wittmann                         }
2666bc1ee56aSOliver-Rainer Wittmann                         sCombinedCharacters = sPart.Copy( nBegin+1, nEnd-nBegin-1 );
2667bc1ee56aSOliver-Rainer Wittmann                         if ( sCombinedCharacters.Len() )
2668bc1ee56aSOliver-Rainer Wittmann                         {
266969a74367SOliver-Rainer Wittmann                             SwInputField aFld( static_cast<SwInputFieldType*>(rDoc.GetSysFldType( RES_INPUTFLD )),
267069a74367SOliver-Rainer Wittmann                                 sCombinedCharacters, sCombinedCharacters, INP_TXT, 0, false );
2671bc1ee56aSOliver-Rainer Wittmann                             rDoc.InsertPoolItem( *pPaM, SwFmtFld( aFld ), 0 ); // insert input field
2672cdf0e10cSrcweir                         }
2673cdf0e10cSrcweir                     }
2674cdf0e10cSrcweir                 }
2675cdf0e10cSrcweir             }
2676cdf0e10cSrcweir         }
2677bc1ee56aSOliver-Rainer Wittmann     default:
2678bc1ee56aSOliver-Rainer Wittmann         break;
2679cdf0e10cSrcweir     }
2680cdf0e10cSrcweir }
2681cdf0e10cSrcweir 
Read_SubF_Ruby(_ReadFieldParams & rReadParam)2682cdf0e10cSrcweir void SwWW8ImplReader::Read_SubF_Ruby( _ReadFieldParams& rReadParam)
2683cdf0e10cSrcweir {
2684cdf0e10cSrcweir     sal_uInt16 nJustificationCode=0;
2685cdf0e10cSrcweir     String sFontName;
2686cdf0e10cSrcweir     sal_uInt32 nFontSize=0;
2687cdf0e10cSrcweir     String sRuby;
2688cdf0e10cSrcweir     String sText;
2689cdf0e10cSrcweir     long nRet;
2690cdf0e10cSrcweir     while( -1 != ( nRet = rReadParam.SkipToNextToken() ))
2691cdf0e10cSrcweir     {
2692cdf0e10cSrcweir         switch( nRet )
2693cdf0e10cSrcweir         {
2694cdf0e10cSrcweir         case -2:
2695cdf0e10cSrcweir             {
2696cdf0e10cSrcweir                 String sTemp = rReadParam.GetResult();
2697cdf0e10cSrcweir                 if( sTemp.EqualsIgnoreCaseAscii( "jc", 0, 2 ) )
2698cdf0e10cSrcweir                 {
2699cdf0e10cSrcweir                     sTemp.Erase(0,2);
2700cdf0e10cSrcweir                     nJustificationCode = static_cast<sal_uInt16>(sTemp.ToInt32());
2701cdf0e10cSrcweir                 }
2702cdf0e10cSrcweir                 else if( sTemp.EqualsIgnoreCaseAscii( "hps", 0, 3 ) )
2703cdf0e10cSrcweir                 {
2704cdf0e10cSrcweir                     sTemp.Erase(0,3);
2705cdf0e10cSrcweir                     nFontSize= static_cast<sal_uInt32>(sTemp.ToInt32());
2706cdf0e10cSrcweir                 }
2707cdf0e10cSrcweir                 else if( sTemp.EqualsIgnoreCaseAscii( "Font:", 0, 5 ) )
2708cdf0e10cSrcweir                 {
2709cdf0e10cSrcweir                     sTemp.Erase(0,5);
2710cdf0e10cSrcweir                     sFontName = sTemp;
2711cdf0e10cSrcweir                 }
2712cdf0e10cSrcweir             }
2713cdf0e10cSrcweir             break;
2714cdf0e10cSrcweir         case '*':
2715cdf0e10cSrcweir             break;
2716cdf0e10cSrcweir         case 'o':
2717cdf0e10cSrcweir             while( -1 != ( nRet = rReadParam.SkipToNextToken() ))
2718cdf0e10cSrcweir             {
2719cdf0e10cSrcweir                 if ('u' == nRet)
2720cdf0e10cSrcweir                 {
2721cdf0e10cSrcweir                     if (-2 == rReadParam.SkipToNextToken() &&
2722cdf0e10cSrcweir                       (rReadParam.GetResult().EqualsIgnoreCaseAscii('p', 1, 0)))
2723cdf0e10cSrcweir                     {
2724cdf0e10cSrcweir                         if (-2 == rReadParam.SkipToNextToken())
2725cdf0e10cSrcweir                         {
2726cdf0e10cSrcweir                             String sPart = rReadParam.GetResult();
2727cdf0e10cSrcweir                             xub_StrLen nBegin = sPart.Search('(');
2728cdf0e10cSrcweir 
2729cdf0e10cSrcweir                             //Word disallows brackets in this field,
2730cdf0e10cSrcweir                             xub_StrLen nEnd = sPart.Search(')');
2731cdf0e10cSrcweir 
2732cdf0e10cSrcweir                             if ((nBegin != STRING_NOTFOUND) &&
2733cdf0e10cSrcweir                                 (nEnd != STRING_NOTFOUND))
2734cdf0e10cSrcweir                             {
2735cdf0e10cSrcweir                                 sRuby = sPart.Copy(nBegin+1,nEnd-nBegin-1);
2736cdf0e10cSrcweir                             }
2737cdf0e10cSrcweir                             if (STRING_NOTFOUND ==
2738cdf0e10cSrcweir                                 (nBegin = sPart.Search(',',nEnd)))
2739cdf0e10cSrcweir                             {
2740cdf0e10cSrcweir                                 nBegin = sPart.Search(';',nEnd);
2741cdf0e10cSrcweir                             }
2742cdf0e10cSrcweir                             nEnd = sPart.SearchBackward(')');
2743cdf0e10cSrcweir                             if ((nBegin != STRING_NOTFOUND) &&
2744cdf0e10cSrcweir                                 (nEnd != STRING_NOTFOUND))
2745cdf0e10cSrcweir                             {
2746cdf0e10cSrcweir                                 sText = sPart.Copy(nBegin+1,nEnd-nBegin-1);
2747cdf0e10cSrcweir                             }
2748cdf0e10cSrcweir                         }
2749cdf0e10cSrcweir                     }
2750cdf0e10cSrcweir                 }
2751cdf0e10cSrcweir 
2752cdf0e10cSrcweir             }
2753cdf0e10cSrcweir             break;
2754cdf0e10cSrcweir         }
2755cdf0e10cSrcweir     }
2756cdf0e10cSrcweir 
2757cdf0e10cSrcweir     //Translate and apply
2758cdf0e10cSrcweir     if (sRuby.Len() && sText.Len() && sFontName.Len() && nFontSize)
2759cdf0e10cSrcweir     {
2760cdf0e10cSrcweir         switch (nJustificationCode)
2761cdf0e10cSrcweir         {
2762cdf0e10cSrcweir             case 0:
2763cdf0e10cSrcweir                 nJustificationCode=1;
2764cdf0e10cSrcweir                 break;
2765cdf0e10cSrcweir             case 1:
2766cdf0e10cSrcweir                 nJustificationCode=3;
2767cdf0e10cSrcweir                 break;
2768cdf0e10cSrcweir             case 2:
2769cdf0e10cSrcweir                 nJustificationCode=4;
2770cdf0e10cSrcweir                 break;
2771cdf0e10cSrcweir             default:
2772cdf0e10cSrcweir             case 3:
2773cdf0e10cSrcweir                 nJustificationCode=0;
2774cdf0e10cSrcweir                 break;
2775cdf0e10cSrcweir             case 4:
2776cdf0e10cSrcweir                 nJustificationCode=2;
2777cdf0e10cSrcweir                 break;
2778cdf0e10cSrcweir         }
2779cdf0e10cSrcweir 
2780cdf0e10cSrcweir         SwFmtRuby aRuby(sRuby);
2781cdf0e10cSrcweir         const SwCharFmt *pCharFmt=0;
2782cdf0e10cSrcweir         //Make a guess at which of asian of western we should be setting
2783cdf0e10cSrcweir         sal_uInt16 nScript;
2784cdf0e10cSrcweir         if (pBreakIt->GetBreakIter().is())
2785cdf0e10cSrcweir             nScript = pBreakIt->GetBreakIter()->getScriptType(sRuby, 0);
2786cdf0e10cSrcweir         else
2787cdf0e10cSrcweir             nScript = i18n::ScriptType::ASIAN;
2788cdf0e10cSrcweir 
2789cdf0e10cSrcweir         //Check to see if we already have a ruby charstyle that this fits
2790cdf0e10cSrcweir         std::vector<const SwCharFmt*>::const_iterator aEnd =
2791cdf0e10cSrcweir             aRubyCharFmts.end();
2792cdf0e10cSrcweir         for(std::vector<const SwCharFmt*>::const_iterator aIter
2793cdf0e10cSrcweir             = aRubyCharFmts.begin(); aIter != aEnd; ++aIter)
2794cdf0e10cSrcweir         {
2795cdf0e10cSrcweir             const SvxFontHeightItem &rFH =
2796cdf0e10cSrcweir                 ItemGet<SvxFontHeightItem>(*(*aIter),
2797cdf0e10cSrcweir                 GetWhichOfScript(RES_CHRATR_FONTSIZE,nScript));
2798cdf0e10cSrcweir             if (rFH.GetHeight() == nFontSize*10)
2799cdf0e10cSrcweir             {
2800cdf0e10cSrcweir                 const SvxFontItem &rF = ItemGet<SvxFontItem>(*(*aIter),
2801cdf0e10cSrcweir                     GetWhichOfScript(RES_CHRATR_FONT,nScript));
2802cdf0e10cSrcweir                 if (rF.GetFamilyName().Equals(sFontName))
2803cdf0e10cSrcweir                 {
2804cdf0e10cSrcweir                     pCharFmt=*aIter;
2805cdf0e10cSrcweir                     break;
2806cdf0e10cSrcweir                 }
2807cdf0e10cSrcweir             }
2808cdf0e10cSrcweir         }
2809cdf0e10cSrcweir 
2810cdf0e10cSrcweir         //Create a new char style if necessary
2811cdf0e10cSrcweir         if (!pCharFmt)
2812cdf0e10cSrcweir         {
2813cdf0e10cSrcweir             SwCharFmt *pFmt=0;
2814cdf0e10cSrcweir             String aNm;
2815cdf0e10cSrcweir             //Take this as the base name
2816cdf0e10cSrcweir             SwStyleNameMapper::FillUIName(RES_POOLCHR_RUBYTEXT,aNm);
2817cdf0e10cSrcweir             aNm+=String::CreateFromInt32(aRubyCharFmts.size()+1);
2818cdf0e10cSrcweir             pFmt = rDoc.MakeCharFmt(aNm,(SwCharFmt*)rDoc.GetDfltCharFmt());
2819cdf0e10cSrcweir             SvxFontHeightItem aHeightItem(nFontSize*10, 100, RES_CHRATR_FONTSIZE);
2820cdf0e10cSrcweir             SvxFontItem aFontItem(FAMILY_DONTKNOW,sFontName,
2821cdf0e10cSrcweir                 aEmptyStr,PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW, RES_CHRATR_FONT);
2822cdf0e10cSrcweir             aHeightItem.SetWhich(GetWhichOfScript(RES_CHRATR_FONTSIZE,nScript));
2823cdf0e10cSrcweir             aFontItem.SetWhich(GetWhichOfScript(RES_CHRATR_FONT,nScript));
2824cdf0e10cSrcweir             pFmt->SetFmtAttr(aHeightItem);
2825cdf0e10cSrcweir             pFmt->SetFmtAttr(aFontItem);
2826cdf0e10cSrcweir             aRubyCharFmts.push_back(pFmt);
2827cdf0e10cSrcweir             pCharFmt = pFmt;
2828cdf0e10cSrcweir         }
2829cdf0e10cSrcweir 
2830cdf0e10cSrcweir         //Set the charstyle and justification
2831cdf0e10cSrcweir         aRuby.SetCharFmtName(pCharFmt->GetName());
2832cdf0e10cSrcweir         aRuby.SetCharFmtId(pCharFmt->GetPoolFmtId());
2833cdf0e10cSrcweir         aRuby.SetAdjustment(nJustificationCode);
2834cdf0e10cSrcweir 
2835cdf0e10cSrcweir         NewAttr(aRuby);
2836cdf0e10cSrcweir         rDoc.InsertString( *pPaM, sText );
2837cdf0e10cSrcweir         pCtrlStck->SetAttr( *pPaM->GetPoint(), RES_TXTATR_CJK_RUBY );
2838cdf0e10cSrcweir     }
2839cdf0e10cSrcweir }
2840cdf0e10cSrcweir 
2841cdf0e10cSrcweir //-----------------------------------------
2842cdf0e10cSrcweir //        Verzeichnis-Felder
2843cdf0e10cSrcweir //-----------------------------------------
2844cdf0e10cSrcweir 
lcl_toxMatchACSwitch(SwWW8ImplReader &,SwDoc & rDoc,SwTOXBase & rBase,_ReadFieldParams & rParam,SwCaptionDisplay eCaptionType)2845cdf0e10cSrcweir void lcl_toxMatchACSwitch(  SwWW8ImplReader& /*rReader*/,
2846cdf0e10cSrcweir                             SwDoc& rDoc,
2847cdf0e10cSrcweir                             SwTOXBase& rBase,
2848cdf0e10cSrcweir                             _ReadFieldParams& rParam,
2849cdf0e10cSrcweir                             SwCaptionDisplay eCaptionType)
2850cdf0e10cSrcweir {
2851cdf0e10cSrcweir     xub_StrLen n = rParam.GoToTokenParam();
2852cdf0e10cSrcweir     if( STRING_NOTFOUND != n )
2853cdf0e10cSrcweir     {
2854cdf0e10cSrcweir         SwTOXType* pType = (SwTOXType*)rDoc.GetTOXType( TOX_ILLUSTRATIONS, 0);
2855cdf0e10cSrcweir         rBase.RegisterToTOXType( *pType );
2856cdf0e10cSrcweir         rBase.SetCaptionDisplay( eCaptionType );
2857cdf0e10cSrcweir         // Read Sequence Name and store in TOXBase
2858cdf0e10cSrcweir         String sSeqName( rParam.GetResult() );
2859cdf0e10cSrcweir         lcl_ConvertSequenceName( sSeqName );
2860cdf0e10cSrcweir         rBase.SetSequenceName( sSeqName );
2861cdf0e10cSrcweir     }
2862cdf0e10cSrcweir }
2863cdf0e10cSrcweir 
2864cdf0e10cSrcweir 
EnsureMaxLevelForTemplates(SwTOXBase & rBase)2865cdf0e10cSrcweir static void EnsureMaxLevelForTemplates(SwTOXBase& rBase)
2866cdf0e10cSrcweir {
2867cdf0e10cSrcweir     //If the TOC contains Template entries at levels > the evaluation level
2868cdf0e10cSrcweir     //that was initially taken from the max normal outline level of the word TOC
2869cdf0e10cSrcweir     //then we cannot use that for the evaluation level because writer cuts off
2870cdf0e10cSrcweir     //all styles above that level, while word just cuts off the "standard"
2871cdf0e10cSrcweir     //outline styles, we have no option but to expand to the highest level
2872cdf0e10cSrcweir     //Word included.
2873cdf0e10cSrcweir     if ((rBase.GetLevel() != MAXLEVEL) && (nsSwTOXElement::TOX_TEMPLATE & rBase.GetCreateType()))
2874cdf0e10cSrcweir     {
2875cdf0e10cSrcweir         for (sal_uInt16 nI = MAXLEVEL; nI > 0; --nI)
2876cdf0e10cSrcweir         {
2877cdf0e10cSrcweir             String sStyles(rBase.GetStyleNames(nI-1));
2878cdf0e10cSrcweir             if (rBase.GetStyleNames(nI-1).Len())
2879cdf0e10cSrcweir             {
2880cdf0e10cSrcweir                 rBase.SetLevel(nI);
2881cdf0e10cSrcweir                 break;
2882cdf0e10cSrcweir             }
2883cdf0e10cSrcweir         }
2884cdf0e10cSrcweir     }
2885cdf0e10cSrcweir }
2886cdf0e10cSrcweir 
lcl_toxMatchTSwitch(SwWW8ImplReader & rReader,SwTOXBase & rBase,_ReadFieldParams & rParam)2887cdf0e10cSrcweir void lcl_toxMatchTSwitch(SwWW8ImplReader& rReader, SwTOXBase& rBase,
2888cdf0e10cSrcweir     _ReadFieldParams& rParam)
2889cdf0e10cSrcweir {
2890cdf0e10cSrcweir     xub_StrLen n = rParam.GoToTokenParam();
2891cdf0e10cSrcweir     if( STRING_NOTFOUND != n )
2892cdf0e10cSrcweir     {
2893cdf0e10cSrcweir         String sParams( rParam.GetResult() );
2894cdf0e10cSrcweir         if( sParams.Len() )
2895cdf0e10cSrcweir         {
2896cdf0e10cSrcweir             xub_StrLen nIndex = 0;
2897cdf0e10cSrcweir 
2898cdf0e10cSrcweir             //#92940# Delimiters between styles and style levels appears to
2899cdf0e10cSrcweir             //allow both ; and ,
2900cdf0e10cSrcweir 
2901cdf0e10cSrcweir             String sTemplate( sParams.GetToken(0, ';', nIndex) );
2902cdf0e10cSrcweir             if( STRING_NOTFOUND == nIndex )
2903cdf0e10cSrcweir             {
2904cdf0e10cSrcweir                 nIndex=0;
2905cdf0e10cSrcweir                 sTemplate = sParams.GetToken(0, ',', nIndex);
2906cdf0e10cSrcweir             }
2907cdf0e10cSrcweir             if( STRING_NOTFOUND == nIndex )
2908cdf0e10cSrcweir             {
2909cdf0e10cSrcweir                 const SwFmt* pStyle = rReader.GetStyleWithOrgWWName(sTemplate);
2910cdf0e10cSrcweir                 if( pStyle )
2911cdf0e10cSrcweir                     sTemplate = pStyle->GetName();
2912cdf0e10cSrcweir                 // Store Style for Level 0 into TOXBase
2913cdf0e10cSrcweir                 rBase.SetStyleNames( sTemplate, 0 );
2914cdf0e10cSrcweir             }
2915cdf0e10cSrcweir             else while( STRING_NOTFOUND != nIndex )
2916cdf0e10cSrcweir             {
2917cdf0e10cSrcweir                 xub_StrLen nOldIndex=nIndex;
2918cdf0e10cSrcweir                 sal_uInt16 nLevel = static_cast<sal_uInt16>(
2919cdf0e10cSrcweir                     sParams.GetToken(0, ';', nIndex).ToInt32());
2920cdf0e10cSrcweir                 if( STRING_NOTFOUND == nIndex )
2921cdf0e10cSrcweir                 {
2922cdf0e10cSrcweir                     nIndex = nOldIndex;
2923cdf0e10cSrcweir                     nLevel = static_cast<sal_uInt16>(
2924cdf0e10cSrcweir                         sParams.GetToken(0, ',', nIndex).ToInt32());
2925cdf0e10cSrcweir                 }
2926cdf0e10cSrcweir 
2927cdf0e10cSrcweir                 if( (0 < nLevel) && (MAXLEVEL >= nLevel) )
2928cdf0e10cSrcweir                 {
2929cdf0e10cSrcweir                     nLevel--;
2930cdf0e10cSrcweir                     // Store Style and Level into TOXBase
2931cdf0e10cSrcweir                     const SwFmt* pStyle
2932cdf0e10cSrcweir                             = rReader.GetStyleWithOrgWWName( sTemplate );
2933cdf0e10cSrcweir 
2934cdf0e10cSrcweir                     if( pStyle )
2935cdf0e10cSrcweir                         sTemplate = pStyle->GetName();
2936cdf0e10cSrcweir 
2937cdf0e10cSrcweir                     String sStyles( rBase.GetStyleNames( nLevel ) );
2938cdf0e10cSrcweir                     if( sStyles.Len() )
2939cdf0e10cSrcweir                         sStyles += TOX_STYLE_DELIMITER;
2940cdf0e10cSrcweir                     sStyles += sTemplate;
2941cdf0e10cSrcweir                     rBase.SetStyleNames( sStyles, nLevel );
2942cdf0e10cSrcweir                 }
2943cdf0e10cSrcweir                 // read next style name...
2944cdf0e10cSrcweir                 nOldIndex = nIndex;
2945cdf0e10cSrcweir                 sTemplate = sParams.GetToken(0, ';', nIndex);
2946cdf0e10cSrcweir                 if( STRING_NOTFOUND == nIndex )
2947cdf0e10cSrcweir                 {
2948cdf0e10cSrcweir                     nIndex=nOldIndex;
2949cdf0e10cSrcweir                     sTemplate = sParams.GetToken(0, ',', nIndex);
2950cdf0e10cSrcweir                 }
2951cdf0e10cSrcweir             }
2952cdf0e10cSrcweir         }
2953cdf0e10cSrcweir     }
2954cdf0e10cSrcweir }
2955cdf0e10cSrcweir 
CurrentSectionColCount() const2956cdf0e10cSrcweir sal_uInt16 wwSectionManager::CurrentSectionColCount() const
2957cdf0e10cSrcweir {
2958cdf0e10cSrcweir     sal_uInt16 nIndexCols = 1;
2959cdf0e10cSrcweir     if (!maSegments.empty())
2960cdf0e10cSrcweir         nIndexCols = maSegments.back().maSep.ccolM1 + 1;
2961cdf0e10cSrcweir     return nIndexCols;
2962cdf0e10cSrcweir }
2963cdf0e10cSrcweir 
2964cdf0e10cSrcweir //Will there be a new pagebreak at this position (don't know what type
2965cdf0e10cSrcweir //until later)
WillHavePageDescHere(SwNodeIndex aIdx) const2966cdf0e10cSrcweir bool wwSectionManager::WillHavePageDescHere(SwNodeIndex aIdx) const
2967cdf0e10cSrcweir {
2968cdf0e10cSrcweir     bool bRet = false;
2969cdf0e10cSrcweir     if (!maSegments.empty())
2970cdf0e10cSrcweir     {
2971cdf0e10cSrcweir         if (!maSegments.back().IsContinous() &&
2972cdf0e10cSrcweir             maSegments.back().maStart == aIdx)
2973cdf0e10cSrcweir         {
2974cdf0e10cSrcweir             bRet = true;
2975cdf0e10cSrcweir         }
2976cdf0e10cSrcweir     }
2977cdf0e10cSrcweir     return bRet;
2978cdf0e10cSrcweir }
2979cdf0e10cSrcweir 
lcl_GetMaxValidWordTOCLevel(const SwForm & rForm)2980cdf0e10cSrcweir sal_uInt16 lcl_GetMaxValidWordTOCLevel(const SwForm &rForm)
2981cdf0e10cSrcweir {
2982cdf0e10cSrcweir     // GetFormMax() returns level + 1, hence the -1
2983cdf0e10cSrcweir     sal_uInt16 nRet = rForm.GetFormMax()-1;
2984cdf0e10cSrcweir 
2985cdf0e10cSrcweir     // If the max of this type of TOC is greater than the max of a word
2986cdf0e10cSrcweir     // possible toc, then clip to the word max
2987cdf0e10cSrcweir     if (nRet > WW8ListManager::nMaxLevel)
2988cdf0e10cSrcweir         nRet = WW8ListManager::nMaxLevel;
2989cdf0e10cSrcweir 
2990cdf0e10cSrcweir     return nRet;
2991cdf0e10cSrcweir }
2992cdf0e10cSrcweir 
Read_F_Tox(WW8FieldDesc * pF,String & rStr)2993cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, String& rStr )
2994cdf0e10cSrcweir {
2995f66c5aafSOliver-Rainer Wittmann     mbLoadingTOCCache = true;
2996cdf0e10cSrcweir 
2997cdf0e10cSrcweir     if (pF->nLRes < 3)
2998cdf0e10cSrcweir         return FLD_TEXT;      // ignore (#i25440#)
2999cdf0e10cSrcweir 
3000cdf0e10cSrcweir     TOXTypes eTox;                              // Baue ToxBase zusammen
3001cdf0e10cSrcweir     switch( pF->nId )
3002cdf0e10cSrcweir     {
3003cdf0e10cSrcweir         case  8:
3004cdf0e10cSrcweir             eTox = TOX_INDEX;
3005cdf0e10cSrcweir             break;
3006cdf0e10cSrcweir         case 13:
3007cdf0e10cSrcweir             eTox = TOX_CONTENT;
3008cdf0e10cSrcweir             break;
3009cdf0e10cSrcweir         default:
3010cdf0e10cSrcweir             eTox = TOX_USER;
3011cdf0e10cSrcweir             break;
3012cdf0e10cSrcweir     }
3013cdf0e10cSrcweir 
3014cdf0e10cSrcweir     sal_uInt16 nCreateOf = (eTox == TOX_CONTENT) ? nsSwTOXElement::TOX_OUTLINELEVEL : nsSwTOXElement::TOX_MARK;
3015cdf0e10cSrcweir 
3016cdf0e10cSrcweir     sal_uInt16 nIndexCols = 1;
3017cdf0e10cSrcweir 
3018cdf0e10cSrcweir     const SwTOXType* pType = rDoc.GetTOXType( eTox, 0 );
3019cdf0e10cSrcweir     SwForm aOrigForm(eTox);
3020cdf0e10cSrcweir     SwTOXBase* pBase = new SwTOXBase( pType, aOrigForm, nCreateOf, aEmptyStr );
3021cdf0e10cSrcweir     pBase->SetProtected(maSectionManager.CurrentSectionIsProtected());
3022cdf0e10cSrcweir     switch( eTox ){
3023cdf0e10cSrcweir     case TOX_INDEX:
3024cdf0e10cSrcweir         {
3025cdf0e10cSrcweir             sal_uInt16 eOptions = nsSwTOIOptions::TOI_SAME_ENTRY | nsSwTOIOptions::TOI_CASE_SENSITIVE;
3026cdf0e10cSrcweir 
3027cdf0e10cSrcweir             // TOX_OUTLINELEVEL setzen wir genau dann, wenn
3028cdf0e10cSrcweir             // die Parameter \o in 1 bis 9 liegen
3029cdf0e10cSrcweir             // oder der Parameter \f existiert
3030cdf0e10cSrcweir             // oder GARKEINE Switches Parameter angegeben sind.
3031cdf0e10cSrcweir             long nRet;
3032cdf0e10cSrcweir             _ReadFieldParams aReadParam( rStr );
3033cdf0e10cSrcweir             while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
3034cdf0e10cSrcweir             {
3035cdf0e10cSrcweir                 switch( nRet )
3036cdf0e10cSrcweir                 {
3037cdf0e10cSrcweir                 case 'c':
3038cdf0e10cSrcweir                     {
3039cdf0e10cSrcweir                         xub_StrLen n = aReadParam.GoToTokenParam();
3040cdf0e10cSrcweir                         if( STRING_NOTFOUND != n )
3041cdf0e10cSrcweir                         {
3042cdf0e10cSrcweir                             String sParams( aReadParam.GetResult() );
3043cdf0e10cSrcweir                             // if NO String just ignore the \c
3044cdf0e10cSrcweir                             if( sParams.Len() )
3045cdf0e10cSrcweir                             {
3046cdf0e10cSrcweir                                 nIndexCols =
3047cdf0e10cSrcweir                                     static_cast<sal_uInt16>(sParams.ToInt32());
3048cdf0e10cSrcweir                             }
3049cdf0e10cSrcweir                         }
3050cdf0e10cSrcweir                     }
3051cdf0e10cSrcweir                     break;
3052cdf0e10cSrcweir                 case 'e':
3053cdf0e10cSrcweir                     {
3054cdf0e10cSrcweir                         xub_StrLen n = aReadParam.GoToTokenParam();
3055cdf0e10cSrcweir                         if( STRING_NOTFOUND != n )  // if NO String just ignore the \e
3056cdf0e10cSrcweir                         {
3057cdf0e10cSrcweir                             String sDelimiter( aReadParam.GetResult() );
3058cdf0e10cSrcweir                             SwForm aForm( pBase->GetTOXForm() );
3059cdf0e10cSrcweir 
3060cdf0e10cSrcweir                             // Attention: if TOX_CONTENT brave
3061cdf0e10cSrcweir                             //            GetFormMax() returns MAXLEVEL + 1  !!
3062cdf0e10cSrcweir                             sal_uInt16 nEnd = aForm.GetFormMax()-1;
3063cdf0e10cSrcweir 
3064cdf0e10cSrcweir                             for(sal_uInt16 nLevel = 1;
3065cdf0e10cSrcweir                                    nLevel <= nEnd;
3066cdf0e10cSrcweir                                    ++nLevel)
3067cdf0e10cSrcweir                             {
3068cdf0e10cSrcweir                                 // Levels count from 1
3069cdf0e10cSrcweir                                 // Level 0 is reserved for CAPTION
3070cdf0e10cSrcweir 
3071cdf0e10cSrcweir                                 // Delimiter statt Tabstop vor der Seitenzahl einsetzen,
3072cdf0e10cSrcweir                                 // falls es eine Seitenzahl gibt:
3073cdf0e10cSrcweir                                 FormTokenType ePrevType = TOKEN_END;
3074cdf0e10cSrcweir                                 FormTokenType eType;
3075cdf0e10cSrcweir                                 // -> #i21237#
3076cdf0e10cSrcweir                                 SwFormTokens aPattern =
3077cdf0e10cSrcweir                                     aForm.GetPattern(nLevel);
3078cdf0e10cSrcweir                                 SwFormTokens::iterator aIt = aPattern.begin();
3079cdf0e10cSrcweir                                 do
3080cdf0e10cSrcweir                                 {
3081cdf0e10cSrcweir                                     eType = ++aIt == aPattern.end() ? TOKEN_END : aIt->eTokenType;
3082cdf0e10cSrcweir 
3083cdf0e10cSrcweir                                     if (eType == TOKEN_PAGE_NUMS)
3084cdf0e10cSrcweir                                     {
3085cdf0e10cSrcweir                                         if (TOKEN_TAB_STOP == ePrevType)
3086cdf0e10cSrcweir                                         {
3087cdf0e10cSrcweir                                             aIt--;
3088cdf0e10cSrcweir 
3089cdf0e10cSrcweir                                             if(0x09 == sDelimiter.GetChar(0))
3090cdf0e10cSrcweir                                                 aIt->eTabAlign = SVX_TAB_ADJUST_END;
3091cdf0e10cSrcweir                                             else
3092cdf0e10cSrcweir                                             {
3093cdf0e10cSrcweir                                                 SwFormToken aToken(TOKEN_TEXT);
3094cdf0e10cSrcweir                                                 aToken.sText = sDelimiter;
3095cdf0e10cSrcweir                                                 *aIt = aToken;
3096cdf0e10cSrcweir                                             }
3097cdf0e10cSrcweir                                             aForm.SetPattern(nLevel, aPattern);
3098cdf0e10cSrcweir                                         }
3099cdf0e10cSrcweir 
3100cdf0e10cSrcweir                                         eType = TOKEN_END;
3101cdf0e10cSrcweir                                     }
3102cdf0e10cSrcweir 
3103cdf0e10cSrcweir                                     ePrevType = eType;
3104cdf0e10cSrcweir                                 }
3105cdf0e10cSrcweir                                 while (TOKEN_END != eType);
3106cdf0e10cSrcweir                                 // <- #i21237#
3107cdf0e10cSrcweir                             }
3108cdf0e10cSrcweir                             pBase->SetTOXForm( aForm );
3109cdf0e10cSrcweir                         }
3110cdf0e10cSrcweir                     }
3111cdf0e10cSrcweir                     break;
3112cdf0e10cSrcweir                 case 'h':
3113cdf0e10cSrcweir                     {
3114cdf0e10cSrcweir                         eOptions |= nsSwTOIOptions::TOI_ALPHA_DELIMITTER;
3115cdf0e10cSrcweir                     }
3116cdf0e10cSrcweir                     break;
3117cdf0e10cSrcweir                 }
3118cdf0e10cSrcweir             }
3119cdf0e10cSrcweir             pBase->SetOptions( eOptions );
3120cdf0e10cSrcweir         }
3121cdf0e10cSrcweir         break;
3122cdf0e10cSrcweir 
3123cdf0e10cSrcweir     case TOX_CONTENT:
3124cdf0e10cSrcweir         {
3125cdf0e10cSrcweir             bool bIsHyperlink = false;
3126f66c5aafSOliver-Rainer Wittmann             bool bShowPage = true;
3127cdf0e10cSrcweir             // TOX_OUTLINELEVEL setzen wir genau dann, wenn
3128cdf0e10cSrcweir             // die Parameter \o in 1 bis 9 liegen
3129cdf0e10cSrcweir             // oder der Parameter \f existiert
3130cdf0e10cSrcweir             // oder GARKEINE Switches Parameter angegeben sind.
3131cdf0e10cSrcweir             sal_uInt16 eCreateFrom = 0;
3132cdf0e10cSrcweir             sal_uInt16 nMaxLevel = 0;
3133cdf0e10cSrcweir             long nRet;
3134cdf0e10cSrcweir             _ReadFieldParams aReadParam( rStr );
3135cdf0e10cSrcweir             while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
3136cdf0e10cSrcweir             {
3137cdf0e10cSrcweir                 switch( nRet )
3138cdf0e10cSrcweir                 {
3139cdf0e10cSrcweir                 case 'h':
3140cdf0e10cSrcweir                     bIsHyperlink = true;
3141cdf0e10cSrcweir                     break;
3142cdf0e10cSrcweir                 case 'a':
3143cdf0e10cSrcweir                 case 'c':
3144cdf0e10cSrcweir                     lcl_toxMatchACSwitch(*this, rDoc, *pBase, aReadParam,
3145cdf0e10cSrcweir                                            ('c' == nRet)
3146cdf0e10cSrcweir                                          ? CAPTION_COMPLETE
3147cdf0e10cSrcweir                                          : CAPTION_TEXT );
3148cdf0e10cSrcweir                     break;
3149cdf0e10cSrcweir                 case 'o':
3150cdf0e10cSrcweir                     {
3151cdf0e10cSrcweir                         sal_uInt16 nVal;
3152cdf0e10cSrcweir                         if( !aReadParam.GetTokenSttFromTo(0, &nVal, WW8ListManager::nMaxLevel) )
3153cdf0e10cSrcweir                             nVal = lcl_GetMaxValidWordTOCLevel(aOrigForm);
3154cdf0e10cSrcweir                         if( nMaxLevel < nVal )
3155cdf0e10cSrcweir                             nMaxLevel = nVal;
3156cdf0e10cSrcweir                         eCreateFrom |= nsSwTOXElement::TOX_OUTLINELEVEL;
3157cdf0e10cSrcweir                     }
3158cdf0e10cSrcweir                     break;
3159cdf0e10cSrcweir                 case 'f':
3160cdf0e10cSrcweir                     eCreateFrom |= nsSwTOXElement::TOX_MARK;
3161cdf0e10cSrcweir                     break;
3162cdf0e10cSrcweir                 case 'l':
3163cdf0e10cSrcweir                     {
3164cdf0e10cSrcweir                         sal_uInt16 nVal;
3165cdf0e10cSrcweir                         if( aReadParam.GetTokenSttFromTo(0, &nVal, WW8ListManager::nMaxLevel) )
3166cdf0e10cSrcweir                         {
3167cdf0e10cSrcweir                             if( nMaxLevel < nVal )
3168cdf0e10cSrcweir                                 nMaxLevel = nVal;
3169cdf0e10cSrcweir                             eCreateFrom |= nsSwTOXElement::TOX_MARK;
3170cdf0e10cSrcweir                         }
3171cdf0e10cSrcweir                     }
3172cdf0e10cSrcweir                     break;
3173cdf0e10cSrcweir                 case 't': // paragraphs using special styles shall
3174cdf0e10cSrcweir                           // provide the TOX's content
3175cdf0e10cSrcweir                     lcl_toxMatchTSwitch(*this, *pBase, aReadParam);
3176cdf0e10cSrcweir                     eCreateFrom |= nsSwTOXElement::TOX_TEMPLATE;
3177cdf0e10cSrcweir                     break;
3178cdf0e10cSrcweir                 case 'p':
3179cdf0e10cSrcweir                     {
3180cdf0e10cSrcweir                         xub_StrLen n = aReadParam.GoToTokenParam();
3181cdf0e10cSrcweir                         if( STRING_NOTFOUND != n )  // if NO String just ignore the \p
3182cdf0e10cSrcweir                         {
3183cdf0e10cSrcweir                             String sDelimiter( aReadParam.GetResult() );
3184cdf0e10cSrcweir                             SwForm aForm( pBase->GetTOXForm() );
3185cdf0e10cSrcweir 
3186cdf0e10cSrcweir                             // Attention: if TOX_CONTENT brave
3187cdf0e10cSrcweir                             //            GetFormMax() returns MAXLEVEL + 1  !!
3188cdf0e10cSrcweir                             sal_uInt16 nEnd = aForm.GetFormMax()-1;
3189cdf0e10cSrcweir 
3190cdf0e10cSrcweir                             for(sal_uInt16 nLevel = 1;
3191cdf0e10cSrcweir                                    nLevel <= nEnd;
3192cdf0e10cSrcweir                                    ++nLevel)
3193cdf0e10cSrcweir                             {
3194cdf0e10cSrcweir                                 // Levels count from 1
3195cdf0e10cSrcweir                                 // Level 0 is reserved for CAPTION
3196cdf0e10cSrcweir 
3197cdf0e10cSrcweir                                 // Delimiter statt Tabstop vor der Seitenzahl einsetzen,
3198cdf0e10cSrcweir                                 // falls es eine Seitenzahl gibt:
3199cdf0e10cSrcweir                                 FormTokenType ePrevType = TOKEN_END;
3200cdf0e10cSrcweir                                 FormTokenType eType;
3201cdf0e10cSrcweir 
3202cdf0e10cSrcweir                                 // -> #i21237#
3203cdf0e10cSrcweir                                 SwFormTokens aPattern = aForm.GetPattern(nLevel);
3204cdf0e10cSrcweir                                 SwFormTokens::iterator aIt = aPattern.begin();
3205cdf0e10cSrcweir                                 do
3206cdf0e10cSrcweir                                 {
3207cdf0e10cSrcweir                                     eType = ++aIt == aPattern.end() ? TOKEN_END : aIt->eTokenType;
3208cdf0e10cSrcweir 
3209cdf0e10cSrcweir                                     if (eType == TOKEN_PAGE_NUMS)
3210cdf0e10cSrcweir                                     {
3211cdf0e10cSrcweir                                         if (TOKEN_TAB_STOP == ePrevType)
3212cdf0e10cSrcweir                                         {
3213cdf0e10cSrcweir                                             aIt--;
3214cdf0e10cSrcweir 
3215cdf0e10cSrcweir                                             SwFormToken aToken(TOKEN_TEXT);
3216cdf0e10cSrcweir                                             aToken.sText = sDelimiter;
3217cdf0e10cSrcweir 
3218cdf0e10cSrcweir                                             *aIt = aToken;
3219cdf0e10cSrcweir                                             aForm.SetPattern(nLevel,
3220cdf0e10cSrcweir                                                              aPattern);
3221cdf0e10cSrcweir                                         }
3222cdf0e10cSrcweir                                         eType = TOKEN_END;
3223cdf0e10cSrcweir                                     }
3224cdf0e10cSrcweir                                     ePrevType = eType;
3225cdf0e10cSrcweir                                 }
3226cdf0e10cSrcweir                                 while( TOKEN_END != eType );
3227cdf0e10cSrcweir                                 // <- #i21237#
3228cdf0e10cSrcweir                             }
3229cdf0e10cSrcweir                             pBase->SetTOXForm( aForm );
3230cdf0e10cSrcweir                         }
3231cdf0e10cSrcweir                     }
3232cdf0e10cSrcweir                     break;
3233cdf0e10cSrcweir                 case 'n': // don't print page numbers
3234cdf0e10cSrcweir                     {
3235cdf0e10cSrcweir                         // read START and END param
3236f66c5aafSOliver-Rainer Wittmann                         bShowPage = false;
3237cdf0e10cSrcweir                         sal_uInt16 nStart, nEnd;
3238cdf0e10cSrcweir                         if( !aReadParam.GetTokenSttFromTo(  &nStart, &nEnd,
3239cdf0e10cSrcweir                             WW8ListManager::nMaxLevel ) )
3240cdf0e10cSrcweir                         {
3241cdf0e10cSrcweir                             nStart = 1;
3242cdf0e10cSrcweir                             nEnd = aOrigForm.GetFormMax()-1;
3243cdf0e10cSrcweir                         }
3244cdf0e10cSrcweir                         // remove page numbers from this levels
3245cdf0e10cSrcweir                         SwForm aForm( pBase->GetTOXForm() );
3246cdf0e10cSrcweir                         if (aForm.GetFormMax() <= nEnd)
3247cdf0e10cSrcweir                             nEnd = aForm.GetFormMax()-1;
3248cdf0e10cSrcweir                         for (
3249cdf0e10cSrcweir                               sal_uInt16 nLevel = nStart; nLevel <= nEnd;
3250cdf0e10cSrcweir                               ++nLevel
3251cdf0e10cSrcweir                             )
3252cdf0e10cSrcweir                         {
3253cdf0e10cSrcweir                             // Levels count from 1
3254cdf0e10cSrcweir                             // Level 0 is reserved for CAPTION
3255cdf0e10cSrcweir 
3256cdf0e10cSrcweir                             // Seitenzahl und ggfs. davorstehenden Tabstop
3257cdf0e10cSrcweir                             // entfernen:
3258cdf0e10cSrcweir                             FormTokenType eType;
3259cdf0e10cSrcweir                             // -> #i21237#
3260cdf0e10cSrcweir                             SwFormTokens aPattern = aForm.GetPattern(nLevel);
3261cdf0e10cSrcweir                             SwFormTokens::iterator aIt = aPattern.begin();
3262cdf0e10cSrcweir                             do
3263cdf0e10cSrcweir                             {
3264cdf0e10cSrcweir                                 eType = ++aIt == aPattern.end() ? TOKEN_END : aIt->eTokenType;
3265cdf0e10cSrcweir 
3266cdf0e10cSrcweir                                 if (eType == TOKEN_PAGE_NUMS)
3267cdf0e10cSrcweir                                 {
3268cdf0e10cSrcweir                                     aIt = aPattern.erase(aIt);
3269cdf0e10cSrcweir                                     aIt--;
3270cdf0e10cSrcweir                                     if (
3271cdf0e10cSrcweir                                          TOKEN_TAB_STOP ==
3272cdf0e10cSrcweir                                          aIt->eTokenType
3273cdf0e10cSrcweir                                        )
3274cdf0e10cSrcweir                                     {
3275cdf0e10cSrcweir                                         aPattern.erase(aIt);
3276cdf0e10cSrcweir                                         aForm.SetPattern(nLevel, aPattern);
3277cdf0e10cSrcweir                                     }
3278cdf0e10cSrcweir                                     eType = TOKEN_END;
3279cdf0e10cSrcweir                                 }
3280cdf0e10cSrcweir                             }
3281cdf0e10cSrcweir                             while (TOKEN_END != eType);
3282cdf0e10cSrcweir                             // <- #i21237#
3283cdf0e10cSrcweir                         }
3284cdf0e10cSrcweir                         pBase->SetTOXForm( aForm );
3285cdf0e10cSrcweir                     }
3286cdf0e10cSrcweir                     break;
3287cdf0e10cSrcweir 
3288cdf0e10cSrcweir                 /*
3289cdf0e10cSrcweir                 // the following switches are not (yet) supported
3290cdf0e10cSrcweir                 // by good old StarWriter:
3291cdf0e10cSrcweir                 case 'b':
3292cdf0e10cSrcweir                 case 's':
3293cdf0e10cSrcweir                 case 'd':
3294cdf0e10cSrcweir                     break;
3295cdf0e10cSrcweir                 */
3296cdf0e10cSrcweir                 }
3297cdf0e10cSrcweir             }
3298cdf0e10cSrcweir 
3299f66c5aafSOliver-Rainer Wittmann             // For loading the expression of TOC field, we need to mapping its parameters to TOX entries tokens
3300f66c5aafSOliver-Rainer Wittmann             // also include the hyperlinks and page references
3301f66c5aafSOliver-Rainer Wittmann             SwFormToken aLinkStart(TOKEN_LINK_START);
3302f66c5aafSOliver-Rainer Wittmann             SwFormToken aLinkEnd(TOKEN_LINK_END);
3303f66c5aafSOliver-Rainer Wittmann             aLinkStart.sCharStyleName = String::CreateFromAscii("Index Link");
3304f66c5aafSOliver-Rainer Wittmann             aLinkEnd.sCharStyleName = String::CreateFromAscii("Index Link");
3305f66c5aafSOliver-Rainer Wittmann             SwForm aForm(pBase->GetTOXForm());
3306f66c5aafSOliver-Rainer Wittmann             sal_uInt16 nEnd = aForm.GetFormMax()-1;
3307cdf0e10cSrcweir 
3308f66c5aafSOliver-Rainer Wittmann             for(sal_uInt16 nLevel = 1; nLevel <= nEnd; ++nLevel)
3309f66c5aafSOliver-Rainer Wittmann             {
3310f66c5aafSOliver-Rainer Wittmann                 SwFormTokens aPattern = aForm.GetPattern(nLevel);
3311f66c5aafSOliver-Rainer Wittmann                 if ( bIsHyperlink )
3312cdf0e10cSrcweir                 {
3313cdf0e10cSrcweir                     aPattern.insert(aPattern.begin(), aLinkStart);
3314cdf0e10cSrcweir                 }
3315f66c5aafSOliver-Rainer Wittmann                 else if ( bShowPage )
3316f66c5aafSOliver-Rainer Wittmann                 {
3317f66c5aafSOliver-Rainer Wittmann                     for (SwFormTokens::iterator aItr = aPattern.begin();aItr!= aPattern.end();aItr++)
3318f66c5aafSOliver-Rainer Wittmann                     {
3319f66c5aafSOliver-Rainer Wittmann                         if (aItr->eTokenType == TOKEN_PAGE_NUMS)
3320f66c5aafSOliver-Rainer Wittmann                         {
3321f66c5aafSOliver-Rainer Wittmann                             aPattern.insert(aItr,aLinkStart);
3322f66c5aafSOliver-Rainer Wittmann                             break;
3323f66c5aafSOliver-Rainer Wittmann                         }
3324f66c5aafSOliver-Rainer Wittmann                     }
3325f66c5aafSOliver-Rainer Wittmann                 }
3326f66c5aafSOliver-Rainer Wittmann                 aPattern.push_back(aLinkEnd);
3327f66c5aafSOliver-Rainer Wittmann                 aForm.SetPattern(nLevel, aPattern);
3328cdf0e10cSrcweir             }
3329f66c5aafSOliver-Rainer Wittmann             pBase->SetTOXForm(aForm);
3330cdf0e10cSrcweir 
3331cdf0e10cSrcweir             if (!nMaxLevel)
3332cdf0e10cSrcweir                 nMaxLevel = WW8ListManager::nMaxLevel;
3333cdf0e10cSrcweir             pBase->SetLevel(nMaxLevel);
3334cdf0e10cSrcweir 
3335cdf0e10cSrcweir             const TOXTypes eType = pBase->GetTOXType()->GetType();
3336cdf0e10cSrcweir             switch( eType )
3337cdf0e10cSrcweir             {
3338cdf0e10cSrcweir                 case TOX_CONTENT:
3339cdf0e10cSrcweir                     {
3340cdf0e10cSrcweir                         //If we would be created from outlines, either explictly or by default
3341cdf0e10cSrcweir                         //then see if we need extra styles added to the outlines
3342cdf0e10cSrcweir                         sal_uInt16 eEffectivelyFrom = eCreateFrom ? eCreateFrom : nsSwTOXElement::TOX_OUTLINELEVEL;
3343cdf0e10cSrcweir                         if (eEffectivelyFrom & nsSwTOXElement::TOX_OUTLINELEVEL)
3344cdf0e10cSrcweir                         {
3345497ff032SOliver-Rainer Wittmann                             // #i19683# Insert a text token " " between the number and entry token.
3346497ff032SOliver-Rainer Wittmann                             // In an ideal world we could handle the tab stop between the number and
3347497ff032SOliver-Rainer Wittmann                             // the entry correctly, but I currently have no clue how to obtain the tab stop position.
3348cdf0e10cSrcweir                             // It is _not_ set at the paragraph style.
3349cdf0e10cSrcweir                             SwForm* pForm = 0;
3350cdf0e10cSrcweir                             for (sal_uInt16 nI = 0; nI < nColls; ++nI)
3351cdf0e10cSrcweir                             {
3352cdf0e10cSrcweir                                 const SwWW8StyInf& rSI = pCollA[nI];
3353cdf0e10cSrcweir                                 if (rSI.IsOutlineNumbered())
3354cdf0e10cSrcweir                                 {
3355497ff032SOliver-Rainer Wittmann                                     sal_uInt16 nStyleLevel = rSI.mnWW8OutlineLevel;
3356cdf0e10cSrcweir                                     const SwNumFmt& rFmt = rSI.GetOutlineNumrule()->Get( nStyleLevel );
3357cdf0e10cSrcweir                                     if ( SVX_NUM_NUMBER_NONE != rFmt.GetNumberingType() )
3358cdf0e10cSrcweir                                     {
3359cdf0e10cSrcweir                                         ++nStyleLevel;
3360cdf0e10cSrcweir 
3361cdf0e10cSrcweir                                         if ( !pForm )
3362cdf0e10cSrcweir                                             pForm = new SwForm( pBase->GetTOXForm() );
3363cdf0e10cSrcweir 
3364cdf0e10cSrcweir                                         SwFormTokens aPattern = pForm->GetPattern(nStyleLevel);
3365cdf0e10cSrcweir                                         SwFormTokens::iterator aIt =
3366cdf0e10cSrcweir                                                 find_if(aPattern.begin(), aPattern.end(),
3367cdf0e10cSrcweir                                                 SwFormTokenEqualToFormTokenType(TOKEN_ENTRY_NO));
3368cdf0e10cSrcweir 
3369cdf0e10cSrcweir                                         if ( aIt != aPattern.end() )
3370cdf0e10cSrcweir                                         {
3371cdf0e10cSrcweir                                             SwFormToken aNumberEntrySeparator( TOKEN_TEXT );
3372cdf0e10cSrcweir                                             aNumberEntrySeparator.sText = String::CreateFromAscii(" ");
3373cdf0e10cSrcweir                                             aPattern.insert( ++aIt, aNumberEntrySeparator );
3374cdf0e10cSrcweir                                             pForm->SetPattern( nStyleLevel, aPattern );
3375cdf0e10cSrcweir                                         }
3376cdf0e10cSrcweir                                     }
3377cdf0e10cSrcweir                                 }
3378cdf0e10cSrcweir                             }
3379cdf0e10cSrcweir                             if ( pForm )
3380*2650be22SPedro Giffuni                             {
3381cdf0e10cSrcweir                                 pBase->SetTOXForm( *pForm );
3382*2650be22SPedro Giffuni                                 delete pForm;
3383*2650be22SPedro Giffuni                             }
3384cdf0e10cSrcweir                         }
3385cdf0e10cSrcweir 
3386cdf0e10cSrcweir                         if (eCreateFrom)
3387cdf0e10cSrcweir                             pBase->SetCreate(eCreateFrom);
3388cdf0e10cSrcweir                         EnsureMaxLevelForTemplates(*pBase);
3389cdf0e10cSrcweir                     }
3390cdf0e10cSrcweir                     break;
3391cdf0e10cSrcweir                 case TOX_ILLUSTRATIONS:
3392cdf0e10cSrcweir                     {
3393cdf0e10cSrcweir                         if( !eCreateFrom )
3394cdf0e10cSrcweir                             eCreateFrom = nsSwTOXElement::TOX_SEQUENCE;
3395cdf0e10cSrcweir                         pBase->SetCreate( eCreateFrom );
3396cdf0e10cSrcweir 
3397cdf0e10cSrcweir                         /*
3398cdf0e10cSrcweir                         #91214#
3399cdf0e10cSrcweir                         We don't know until here if we are an illustration
3400cdf0e10cSrcweir                         or not, and so have being used a TOX_CONTENT so far
3401cdf0e10cSrcweir                         which has 10 levels, while TOX has only two, this
3402cdf0e10cSrcweir                         level is set only in the constructor of SwForm, so
3403cdf0e10cSrcweir                         create a new one and copy over anything that could
3404cdf0e10cSrcweir                         be set in the old one, and remove entries from the
3405cdf0e10cSrcweir                         pattern which do not apply to illustration indices
3406cdf0e10cSrcweir                         */
3407cdf0e10cSrcweir                         SwForm aOldForm( pBase->GetTOXForm() );
3408cdf0e10cSrcweir                         SwForm aForm( eType );
3409cdf0e10cSrcweir                         sal_uInt16 nEnd = aForm.GetFormMax()-1;
3410cdf0e10cSrcweir 
3411cdf0e10cSrcweir                         // -> #i21237#
3412cdf0e10cSrcweir                         for(sal_uInt16 nLevel = 1; nLevel <= nEnd; ++nLevel)
3413cdf0e10cSrcweir                         {
3414cdf0e10cSrcweir                             SwFormTokens aPattern = aOldForm.GetPattern(nLevel);
3415cdf0e10cSrcweir 
3416cdf0e10cSrcweir                             SwFormTokens::iterator new_end=remove_if(aPattern.begin(), aPattern.end(),
3417cdf0e10cSrcweir                                       SwFormTokenEqualToFormTokenType(TOKEN_ENTRY_NO));
3418cdf0e10cSrcweir 
3419cdf0e10cSrcweir                             aPattern.erase (new_end, aPattern.end() ); // #124710#: table index imported with wrong page number format
3420cdf0e10cSrcweir 
3421cdf0e10cSrcweir                             aForm.SetPattern(nLevel, aPattern);
3422cdf0e10cSrcweir 
3423cdf0e10cSrcweir                             aForm.SetTemplate( nLevel,
3424cdf0e10cSrcweir                                 aOldForm.GetTemplate(nLevel));
3425cdf0e10cSrcweir                         }
3426cdf0e10cSrcweir                         // <- #i21237#
3427cdf0e10cSrcweir 
3428cdf0e10cSrcweir                         pBase->SetTOXForm( aForm );
3429cdf0e10cSrcweir                     }
3430cdf0e10cSrcweir                     break;
3431cdf0e10cSrcweir                 default:
3432cdf0e10cSrcweir                     ASSERT(!this, "Unhandled toc options!");
3433cdf0e10cSrcweir                     break;
3434cdf0e10cSrcweir             }
3435cdf0e10cSrcweir         }
3436cdf0e10cSrcweir         break;
3437cdf0e10cSrcweir     case TOX_USER:
3438cdf0e10cSrcweir         break;
3439cdf0e10cSrcweir     default:
3440cdf0e10cSrcweir         ASSERT(!this, "Unhandled toc options!");
3441cdf0e10cSrcweir         break;
3442cdf0e10cSrcweir     } // ToxBase fertig
3443cdf0e10cSrcweir 
3444f66c5aafSOliver-Rainer Wittmann     // no Update of TOC anymore as its actual content is imported and kept.
3445f66c5aafSOliver-Rainer Wittmann     //rDoc.SetUpdateTOX(true);
3446cdf0e10cSrcweir 
3447cdf0e10cSrcweir     // #i21237#
3448cdf0e10cSrcweir     // propagate tab stops from paragraph styles used in TOX to
3449cdf0e10cSrcweir     // patterns of the TOX
3450cdf0e10cSrcweir     pBase->AdjustTabStops(rDoc, sal_True);
3451cdf0e10cSrcweir 
3452cdf0e10cSrcweir     //#i10028# inserting a toc implicltly acts like a parabreak
3453cdf0e10cSrcweir     //in word and writer
3454f66c5aafSOliver-Rainer Wittmann 
3455f66c5aafSOliver-Rainer Wittmann     if ( pPaM->End() &&
3456f66c5aafSOliver-Rainer Wittmann          pPaM->End()->nNode.GetNode().GetTxtNode() &&
3457f66c5aafSOliver-Rainer Wittmann          pPaM->End()->nNode.GetNode().GetTxtNode()->Len() != 0 )
3458f66c5aafSOliver-Rainer Wittmann     {
3459f66c5aafSOliver-Rainer Wittmann         mbCareFirstParaEndInToc = true;
3460f66c5aafSOliver-Rainer Wittmann     }
3461f66c5aafSOliver-Rainer Wittmann 
3462cdf0e10cSrcweir     if (pPaM->GetPoint()->nContent.GetIndex())
3463cdf0e10cSrcweir         AppendTxtNode(*pPaM->GetPoint());
3464cdf0e10cSrcweir 
3465cdf0e10cSrcweir     const SwPosition* pPos = pPaM->GetPoint();
3466cdf0e10cSrcweir 
3467cdf0e10cSrcweir     SwFltTOX aFltTOX( pBase, nIndexCols );
3468cdf0e10cSrcweir 
3469cdf0e10cSrcweir     // test if there is already a break item on this node
3470cdf0e10cSrcweir     if(SwCntntNode* pNd = pPos->nNode.GetNode().GetCntntNode())
3471cdf0e10cSrcweir     {
3472cdf0e10cSrcweir         const SfxItemSet* pSet = pNd->GetpSwAttrSet();
3473cdf0e10cSrcweir         if( pSet )
3474cdf0e10cSrcweir         {
3475cdf0e10cSrcweir             if (SFX_ITEM_SET == pSet->GetItemState(RES_BREAK, false))
3476cdf0e10cSrcweir                 aFltTOX.SetHadBreakItem(true);
3477cdf0e10cSrcweir             if (SFX_ITEM_SET == pSet->GetItemState(RES_PAGEDESC, false))
3478cdf0e10cSrcweir                 aFltTOX.SetHadPageDescItem(true);
3479cdf0e10cSrcweir         }
3480cdf0e10cSrcweir     }
3481cdf0e10cSrcweir 
3482cdf0e10cSrcweir     //Will there be a new pagebreak at this position (don't know what type
3483cdf0e10cSrcweir     //until later)
3484cdf0e10cSrcweir     if (maSectionManager.WillHavePageDescHere(pPos->nNode))
3485cdf0e10cSrcweir         aFltTOX.SetHadPageDescItem(true);
3486cdf0e10cSrcweir 
3487cdf0e10cSrcweir     // Setze Anfang in Stack
3488cdf0e10cSrcweir     pReffedStck->NewAttr( *pPos, aFltTOX );
3489cdf0e10cSrcweir 
3490cdf0e10cSrcweir     rDoc.InsertTableOf(*pPaM->GetPoint(), *aFltTOX.GetBase());
3491cdf0e10cSrcweir 
3492f66c5aafSOliver-Rainer Wittmann     //The TOC field representation contents should be inserted into TOC section, but not after TOC section.
3493f66c5aafSOliver-Rainer Wittmann     //So we need update the document position when loading TOC representation and after loading TOC;
3494f66c5aafSOliver-Rainer Wittmann     if (mpPosAfterTOC)
3495f66c5aafSOliver-Rainer Wittmann     {
3496f66c5aafSOliver-Rainer Wittmann         delete mpPosAfterTOC;
3497f66c5aafSOliver-Rainer Wittmann     }
3498f66c5aafSOliver-Rainer Wittmann     mpPosAfterTOC = new SwPaM(*pPaM);
3499f66c5aafSOliver-Rainer Wittmann     (*pPaM).Move(fnMoveBackward);
3500cdf0e10cSrcweir     SwPaM aRegion(*pPaM);
3501f66c5aafSOliver-Rainer Wittmann 
3502cdf0e10cSrcweir     ASSERT(rDoc.GetCurTOX(*aRegion.GetPoint()), "Misunderstood how toc works");
3503cdf0e10cSrcweir     if (SwTOXBase* pBase2 = (SwTOXBase*)rDoc.GetCurTOX(*aRegion.GetPoint()))
3504cdf0e10cSrcweir     {
3505f66c5aafSOliver-Rainer Wittmann         pBase2->SetMSTOCExpression(rStr);
3506f66c5aafSOliver-Rainer Wittmann 
3507f66c5aafSOliver-Rainer Wittmann         if ( nIndexCols > 1 )
3508cdf0e10cSrcweir         {
3509cdf0e10cSrcweir             // Set the column number for index
3510cdf0e10cSrcweir             SfxItemSet aSet( rDoc.GetAttrPool(), RES_COL, RES_COL );
3511cdf0e10cSrcweir             SwFmtCol aCol;
3512cdf0e10cSrcweir             aCol.Init( nIndexCols, 708, USHRT_MAX );
3513cdf0e10cSrcweir             aSet.Put( aCol );
3514cdf0e10cSrcweir             pBase2->SetAttrSet( aSet );
3515cdf0e10cSrcweir         }
3516cdf0e10cSrcweir 
3517f66c5aafSOliver-Rainer Wittmann         // inserting a toc inserts a section before this point, so adjust pos
3518f66c5aafSOliver-Rainer Wittmann         // for future page/section segment insertion
3519f66c5aafSOliver-Rainer Wittmann         maSectionManager.PrependedInlineNode( *mpPosAfterTOC->GetPoint(), *aRegion.GetNode() );
3520cdf0e10cSrcweir     }
3521cdf0e10cSrcweir 
3522cdf0e10cSrcweir     // Setze Ende in Stack
3523cdf0e10cSrcweir     pReffedStck->SetAttr( *pPos, RES_FLTR_TOX );
3524cdf0e10cSrcweir 
3525cdf0e10cSrcweir     if (!maApos.back()) //a para end in apo doesn't count
3526cdf0e10cSrcweir         bWasParaEnd = true;
3527f66c5aafSOliver-Rainer Wittmann 
3528f66c5aafSOliver-Rainer Wittmann     //Return FLD_TEXT, instead of FLD_OK
3529f66c5aafSOliver-Rainer Wittmann     //FLD_TEXT means the following content, commonly indicate the field representation content should be parsed
3530f66c5aafSOliver-Rainer Wittmann     //FLD_OK means the current field loading is finished. The rest part should be ignored.
3531f66c5aafSOliver-Rainer Wittmann     return FLD_TEXT;
3532cdf0e10cSrcweir }
3533cdf0e10cSrcweir 
Read_F_Shape(WW8FieldDesc *,String &)3534cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Shape(WW8FieldDesc* /*pF*/, String& /*rStr*/)
3535cdf0e10cSrcweir {
3536cdf0e10cSrcweir     /*
3537cdf0e10cSrcweir     #i3958# 0x8 followed by 0x1 where the shape is the 0x8 and its anchoring
3538cdf0e10cSrcweir     to be ignored followed by a 0x1 with an empty drawing. Detect in inserting
3539cdf0e10cSrcweir     the drawing that we are in the Shape field and respond accordingly
3540cdf0e10cSrcweir     */
3541cdf0e10cSrcweir     return FLD_TEXT;
3542cdf0e10cSrcweir  }
3543cdf0e10cSrcweir 
Read_F_Hyperlink(WW8FieldDesc *,String & rStr)3544cdf0e10cSrcweir eF_ResT SwWW8ImplReader::Read_F_Hyperlink( WW8FieldDesc* /*pF*/, String& rStr )
3545cdf0e10cSrcweir {
3546cdf0e10cSrcweir     String sURL, sTarget, sMark;
3547cdf0e10cSrcweir     bool bDataImport = false;
3548cdf0e10cSrcweir     //HYPERLINk "filename" [switches]
3549cdf0e10cSrcweir     bool bOptions=false;
3550cdf0e10cSrcweir 
3551cdf0e10cSrcweir     rStr.EraseTrailingChars( 1 );
3552cdf0e10cSrcweir 
3553cdf0e10cSrcweir     if (!bDataImport)
3554cdf0e10cSrcweir     {
3555cdf0e10cSrcweir         long nRet;
3556cdf0e10cSrcweir         _ReadFieldParams aReadParam( rStr );
3557cdf0e10cSrcweir         while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
3558cdf0e10cSrcweir         {
3559cdf0e10cSrcweir             switch( nRet )
3560cdf0e10cSrcweir             {
3561cdf0e10cSrcweir                 case -2:
3562cdf0e10cSrcweir                     if (!sURL.Len() & !bOptions)
3563cdf0e10cSrcweir                         ConvertFFileName(sURL, aReadParam.GetResult());
3564cdf0e10cSrcweir                     break;
3565cdf0e10cSrcweir 
3566cdf0e10cSrcweir                 case 'n':
3567cdf0e10cSrcweir                     sTarget.ASSIGN_CONST_ASC( "_blank" );
3568cdf0e10cSrcweir                     bOptions = true;
3569cdf0e10cSrcweir                     break;
3570cdf0e10cSrcweir 
3571cdf0e10cSrcweir                 case 'l':
3572cdf0e10cSrcweir                     nRet = aReadParam.SkipToNextToken();
3573cdf0e10cSrcweir                     bOptions = true;
3574cdf0e10cSrcweir                     if( -2 == nRet )
3575cdf0e10cSrcweir                     {
3576cdf0e10cSrcweir                         sMark = aReadParam.GetResult();
35773078b051SOliver-Rainer Wittmann                         if( sMark.Len() > 0 && '"' == sMark.GetChar( sMark.Len()-1 ) )
35783078b051SOliver-Rainer Wittmann                         {
3579cdf0e10cSrcweir                             sMark.Erase( sMark.Len() - 1 );
35803078b051SOliver-Rainer Wittmann                         }
35813078b051SOliver-Rainer Wittmann                         // #120879# add cross reference bookmark name prefix, if it matches internal TOC bookmark naming convention
35823078b051SOliver-Rainer Wittmann                         if ( IsTOCBookmarkName( sMark ) )
35833078b051SOliver-Rainer Wittmann                         {
35843078b051SOliver-Rainer Wittmann                             String sTmp = IDocumentMarkAccess::GetCrossRefHeadingBookmarkNamePrefix();
35853078b051SOliver-Rainer Wittmann                             sTmp += sMark;
35863078b051SOliver-Rainer Wittmann                             sMark = sTmp;
35873078b051SOliver-Rainer Wittmann                             // track <sMark> as referenced TOC bookmark.
35883078b051SOliver-Rainer Wittmann                             pReffedStck->aReferencedTOCBookmarks.insert( sMark );
35893078b051SOliver-Rainer Wittmann                         }
3590cdf0e10cSrcweir 
3591f66c5aafSOliver-Rainer Wittmann                         if (mbLoadingTOCCache)
3592f66c5aafSOliver-Rainer Wittmann                         {
3593f66c5aafSOliver-Rainer Wittmann                             mbLoadingTOCHyperlink = true;//on loading a TOC field nested hyperlink field
3594f66c5aafSOliver-Rainer Wittmann                         }
3595cdf0e10cSrcweir                     }
3596cdf0e10cSrcweir                     break;
3597cdf0e10cSrcweir                 case 't':
3598cdf0e10cSrcweir                     nRet = aReadParam.SkipToNextToken();
3599cdf0e10cSrcweir                     bOptions = true;
3600cdf0e10cSrcweir                     if (-2 == nRet)
3601cdf0e10cSrcweir                         sTarget = aReadParam.GetResult();
3602cdf0e10cSrcweir                     break;
3603cdf0e10cSrcweir                 case 'h':
3604cdf0e10cSrcweir                 case 'm':
3605cdf0e10cSrcweir                     ASSERT( !this, "Auswertung fehlt noch - Daten unbekannt" );
3606cdf0e10cSrcweir                 case 's':   //worthless fake anchor option
3607cdf0e10cSrcweir                     bOptions = true;
3608cdf0e10cSrcweir                     break;
3609cdf0e10cSrcweir             }
3610cdf0e10cSrcweir         }
3611cdf0e10cSrcweir     }
3612cdf0e10cSrcweir 
3613cdf0e10cSrcweir     // das Resultat uebernehmen
3614cdf0e10cSrcweir     ASSERT((sURL.Len() || sMark.Len()), "WW8: Empty URL")
3615cdf0e10cSrcweir 
3616cdf0e10cSrcweir     if( sMark.Len() )
3617cdf0e10cSrcweir         ( sURL += INET_MARK_TOKEN ) += sMark;
3618cdf0e10cSrcweir 
3619cdf0e10cSrcweir     SwFmtINetFmt aURL( sURL, sTarget );
3620f66c5aafSOliver-Rainer Wittmann     // If on loading TOC field, change the default style into the "index link"
3621f66c5aafSOliver-Rainer Wittmann     if (mbLoadingTOCCache)
3622f66c5aafSOliver-Rainer Wittmann     {
3623f66c5aafSOliver-Rainer Wittmann         String sLinkStyle = String::CreateFromAscii("Index Link");
3624f66c5aafSOliver-Rainer Wittmann         sal_uInt16 nPoolId =
3625f66c5aafSOliver-Rainer Wittmann             SwStyleNameMapper::GetPoolIdFromUIName( sLinkStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
3626782a276cSOliver-Rainer Wittmann         aURL.SetVisitedFmtAndId( sLinkStyle, nPoolId );
3627782a276cSOliver-Rainer Wittmann         aURL.SetINetFmtAndId( sLinkStyle, nPoolId );
3628f66c5aafSOliver-Rainer Wittmann     }
3629cdf0e10cSrcweir 
3630cdf0e10cSrcweir     //As an attribute this needs to be closed, and that'll happen from
3631cdf0e10cSrcweir     //EndExtSprm in conjunction with the maFieldStack If there are are flyfrms
3632cdf0e10cSrcweir     //between the start and begin, their hyperlinks will be set at that time
3633cdf0e10cSrcweir     //as well.
3634cdf0e10cSrcweir     pCtrlStck->NewAttr( *pPaM->GetPoint(), aURL );
3635cdf0e10cSrcweir     return FLD_TEXT;
3636cdf0e10cSrcweir }
3637cdf0e10cSrcweir 
lcl_ImportTox(SwDoc & rDoc,SwPaM & rPaM,const String & rStr,bool bIdx)3638cdf0e10cSrcweir void lcl_ImportTox(SwDoc &rDoc, SwPaM &rPaM, const String &rStr, bool bIdx)
3639cdf0e10cSrcweir {
3640cdf0e10cSrcweir     TOXTypes eTox = ( !bIdx ) ? TOX_CONTENT : TOX_INDEX;    // Default
3641cdf0e10cSrcweir 
3642cdf0e10cSrcweir     sal_uInt16 nLevel = 1;
3643cdf0e10cSrcweir 
3644cdf0e10cSrcweir     xub_StrLen n;
3645cdf0e10cSrcweir     String sFldTxt;
3646cdf0e10cSrcweir     long nRet;
3647cdf0e10cSrcweir     _ReadFieldParams aReadParam(rStr);
3648cdf0e10cSrcweir     while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
3649cdf0e10cSrcweir         switch( nRet )
3650cdf0e10cSrcweir         {
3651cdf0e10cSrcweir         case -2:
3652cdf0e10cSrcweir             if( !sFldTxt.Len() )
3653cdf0e10cSrcweir             {
3654cdf0e10cSrcweir                 // PrimaryKey ohne ":", 2nd dahinter
3655cdf0e10cSrcweir                 sFldTxt = aReadParam.GetResult();
3656cdf0e10cSrcweir             }
3657cdf0e10cSrcweir             break;
3658cdf0e10cSrcweir 
3659cdf0e10cSrcweir         case 'f':
3660cdf0e10cSrcweir             n = aReadParam.GoToTokenParam();
3661cdf0e10cSrcweir             if( STRING_NOTFOUND != n )
3662cdf0e10cSrcweir             {
3663cdf0e10cSrcweir                 String sParams( aReadParam.GetResult() );
3664cdf0e10cSrcweir                 if( 'C' != sParams.GetChar(0) && 'c' != sParams.GetChar(0) )
3665cdf0e10cSrcweir                     eTox = TOX_USER;
3666cdf0e10cSrcweir             }
3667cdf0e10cSrcweir             break;
3668cdf0e10cSrcweir 
3669cdf0e10cSrcweir         case 'l':
3670cdf0e10cSrcweir             n = aReadParam.GoToTokenParam();
3671cdf0e10cSrcweir             if( STRING_NOTFOUND != n )
3672cdf0e10cSrcweir             {
3673cdf0e10cSrcweir                 String sParams( aReadParam.GetResult() );
3674cdf0e10cSrcweir                 if(    sParams.Len() // if NO String just ignore the \l
3675cdf0e10cSrcweir                     && sParams.GetChar( 0 ) > '0'
3676cdf0e10cSrcweir                     && sParams.GetChar( 0 ) <= '9' )
3677cdf0e10cSrcweir                 {
3678cdf0e10cSrcweir                     nLevel = (sal_uInt16)sParams.ToInt32();
3679cdf0e10cSrcweir                 }
3680cdf0e10cSrcweir             }
3681cdf0e10cSrcweir             break;
3682cdf0e10cSrcweir         }
3683cdf0e10cSrcweir 
3684cdf0e10cSrcweir     ASSERT( rDoc.GetTOXTypeCount( eTox ), "Doc.GetTOXTypeCount() == 0  :-(" );
3685cdf0e10cSrcweir 
3686cdf0e10cSrcweir     const SwTOXType* pT = rDoc.GetTOXType( eTox, 0 );
3687cdf0e10cSrcweir     SwTOXMark aM( pT );
3688cdf0e10cSrcweir 
3689cdf0e10cSrcweir     if( eTox != TOX_INDEX )
3690cdf0e10cSrcweir         aM.SetLevel( nLevel );
3691cdf0e10cSrcweir     else
3692cdf0e10cSrcweir     {
3693cdf0e10cSrcweir         xub_StrLen nFnd = sFldTxt.Search( WW8_TOX_LEVEL_DELIM );
3694cdf0e10cSrcweir         if( STRING_NOTFOUND != nFnd )  // it exist levels
3695cdf0e10cSrcweir         {
3696cdf0e10cSrcweir             aM.SetPrimaryKey( sFldTxt.Copy( 0, nFnd ) );
3697cdf0e10cSrcweir             xub_StrLen nScndFnd =
3698cdf0e10cSrcweir                 sFldTxt.Search( WW8_TOX_LEVEL_DELIM, nFnd+1 );
3699cdf0e10cSrcweir             if( STRING_NOTFOUND != nScndFnd )
3700cdf0e10cSrcweir             {
3701cdf0e10cSrcweir                 aM.SetSecondaryKey(  sFldTxt.Copy( nFnd+1, nScndFnd - nFnd - 1 ));
3702cdf0e10cSrcweir                 nFnd = nScndFnd;
3703cdf0e10cSrcweir             }
3704cdf0e10cSrcweir             sFldTxt.Erase( 0, nFnd+1 );
3705cdf0e10cSrcweir         }
3706cdf0e10cSrcweir     }
3707cdf0e10cSrcweir 
3708cdf0e10cSrcweir     if (sFldTxt.Len())
3709cdf0e10cSrcweir     {
3710cdf0e10cSrcweir         aM.SetAlternativeText( sFldTxt );
3711cdf0e10cSrcweir         rDoc.InsertPoolItem( rPaM, aM, 0 );
3712cdf0e10cSrcweir     }
3713cdf0e10cSrcweir }
3714cdf0e10cSrcweir 
ImportXE(SwDoc & rDoc,SwPaM & rPaM,const String & rStr)3715cdf0e10cSrcweir void sw::ms::ImportXE(SwDoc &rDoc, SwPaM &rPaM, const String &rStr)
3716cdf0e10cSrcweir {
3717cdf0e10cSrcweir     lcl_ImportTox(rDoc, rPaM, rStr, true);
3718cdf0e10cSrcweir }
3719cdf0e10cSrcweir 
ImportTox(int nFldId,String aStr)3720cdf0e10cSrcweir void SwWW8ImplReader::ImportTox( int nFldId, String aStr )
3721cdf0e10cSrcweir {
3722cdf0e10cSrcweir     bool bIdx = (nFldId != 9);
3723cdf0e10cSrcweir     lcl_ImportTox(rDoc, *pPaM, aStr, bIdx);
3724cdf0e10cSrcweir }
3725cdf0e10cSrcweir 
Read_FldVanish(sal_uInt16,const sal_uInt8 *,short nLen)3726cdf0e10cSrcweir void SwWW8ImplReader::Read_FldVanish( sal_uInt16, const sal_uInt8*, short nLen )
3727cdf0e10cSrcweir {
3728cdf0e10cSrcweir     //Meaningless in a style
3729cdf0e10cSrcweir     if (pAktColl || !pPlcxMan)
3730cdf0e10cSrcweir         return;
3731cdf0e10cSrcweir 
3732cdf0e10cSrcweir     const int nChunk = 64;  //number of characters to read at one time
3733cdf0e10cSrcweir 
3734cdf0e10cSrcweir     // Vorsicht: Bei Feldnamen mit Umlauten geht das MEMICMP nicht!
3735cdf0e10cSrcweir     const static sal_Char *aFldNames[] = {  "\x06""INHALT", "\x02""XE", // dt.
3736cdf0e10cSrcweir                                             "\x02""TC"  };              // us
3737cdf0e10cSrcweir     const static sal_uInt8  aFldId[] = { 9, 4, 9 };
3738cdf0e10cSrcweir 
3739cdf0e10cSrcweir     if( nLen < 0 )
3740cdf0e10cSrcweir     {
3741cdf0e10cSrcweir         bIgnoreText = false;
3742cdf0e10cSrcweir         return;
3743cdf0e10cSrcweir     }
3744cdf0e10cSrcweir 
3745cdf0e10cSrcweir     // our methode was called from
3746cdf0e10cSrcweir     // ''Skip attributes of field contents'' loop within ReadTextAttr()
3747cdf0e10cSrcweir     if( bIgnoreText )
3748cdf0e10cSrcweir         return;
3749cdf0e10cSrcweir 
3750cdf0e10cSrcweir     bIgnoreText = true;
3751cdf0e10cSrcweir     long nOldPos = pStrm->Tell();
3752cdf0e10cSrcweir 
3753cdf0e10cSrcweir     WW8_CP nStartCp = pPlcxMan->Where() + pPlcxMan->GetCpOfs();
3754cdf0e10cSrcweir 
3755cdf0e10cSrcweir     String sFieldName;
3756cdf0e10cSrcweir     sal_uInt16 nFieldLen = pSBase->WW8ReadString( *pStrm, sFieldName, nStartCp,
3757cdf0e10cSrcweir         nChunk, eStructCharSet );
3758cdf0e10cSrcweir     nStartCp+=nFieldLen;
3759cdf0e10cSrcweir 
3760cdf0e10cSrcweir     xub_StrLen nC = 0;
3761cdf0e10cSrcweir     //If the first chunk did not start with a field start then
3762cdf0e10cSrcweir     //reset the stream position and give up
3763cdf0e10cSrcweir     if( !nFieldLen || (0x13 != sFieldName.GetChar( nC ))) // Field Start Mark
3764cdf0e10cSrcweir     {
3765cdf0e10cSrcweir         // If Field End Mark found
3766cdf0e10cSrcweir         if( nFieldLen && (0x15 == sFieldName.GetChar( nC )))
3767cdf0e10cSrcweir             bIgnoreText = false;
3768cdf0e10cSrcweir         pStrm->Seek( nOldPos );
3769cdf0e10cSrcweir         return;                 // kein Feld zu finden
3770cdf0e10cSrcweir     }
3771cdf0e10cSrcweir 
3772cdf0e10cSrcweir     xub_StrLen nFnd;
3773cdf0e10cSrcweir     //If this chunk does not contain a field end, keep reading chunks
3774cdf0e10cSrcweir     //until we find one, or we run out of text,
3775cdf0e10cSrcweir     while (STRING_NOTFOUND == (nFnd = sFieldName.Search(0x15)))
3776cdf0e10cSrcweir     {
3777cdf0e10cSrcweir         String sTemp;
3778cdf0e10cSrcweir         nFieldLen = pSBase->WW8ReadString( *pStrm, sTemp,
3779cdf0e10cSrcweir         nStartCp, nChunk, eStructCharSet );
3780cdf0e10cSrcweir         sFieldName+=sTemp;
3781cdf0e10cSrcweir         nStartCp+=nFieldLen;
3782cdf0e10cSrcweir         if (!nFieldLen)
3783cdf0e10cSrcweir             break;
3784cdf0e10cSrcweir     }
3785cdf0e10cSrcweir 
3786cdf0e10cSrcweir     pStrm->Seek( nOldPos );
3787cdf0e10cSrcweir 
3788cdf0e10cSrcweir     //if we have no 0x15 give up, otherwise erase everything from the 0x15
3789cdf0e10cSrcweir     //onwards
3790cdf0e10cSrcweir     if (STRING_NOTFOUND == nFnd)
3791cdf0e10cSrcweir         return;
3792cdf0e10cSrcweir     else
3793cdf0e10cSrcweir         sFieldName.Erase(nFnd);
3794cdf0e10cSrcweir 
3795cdf0e10cSrcweir     nC++;
3796cdf0e10cSrcweir     while( ' '  == sFieldName.GetChar( nC ))
3797cdf0e10cSrcweir         nC++;
3798cdf0e10cSrcweir 
3799cdf0e10cSrcweir     for( int i = 0; i < 3; i++ )
3800cdf0e10cSrcweir     {
3801cdf0e10cSrcweir         const sal_Char* pName = aFldNames[i];
3802cdf0e10cSrcweir         sal_uInt16 nNameLen = *pName++;
3803cdf0e10cSrcweir         if( sFieldName.EqualsIgnoreCaseAscii( pName, nC, nNameLen ) )
3804cdf0e10cSrcweir         {
3805cdf0e10cSrcweir             ImportTox( aFldId[i], sFieldName.Copy( nC + nNameLen ) );
3806cdf0e10cSrcweir             break;                  // keine Mehrfachnennungen moeglich
3807cdf0e10cSrcweir         }
3808cdf0e10cSrcweir     }
3809cdf0e10cSrcweir     bIgnoreText = true;
3810cdf0e10cSrcweir     pStrm->Seek( nOldPos );
3811cdf0e10cSrcweir }
3812cdf0e10cSrcweir 
3813cdf0e10cSrcweir /* vi:set tabstop=4 shiftwidth=4 expandtab: */
3814