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