1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
27 #include <tools/string.hxx>
28 #include <tools/debug.hxx>
32 #include <w1struct.hxx>
63 class Ww1PlcAnnotationRef
;
64 class Ww1PlcAnnotationTxt
;
67 class Ww1PlcFootnoteRef
;
68 class Ww1PlcFootnoteTxt
;
80 ///////////////////////////////////////////////////////////////////////
82 // nach moeglichkeit wurden in diesem modul methoden aehnlicher
83 // funktionalitaet gleich benannt. Die namen wurden wenn moeglich vom
84 // ww-filter uebernommen.
85 // Where() gibt die position eines elements. dies kann sowohl eine
86 // seek-position im stream als auch ein relativer offset sein, da dies
87 // bei word durcheinander geht. die methoden sind durch kommentare
88 // gekennzeichnet, ob sie sich auf positionen in der datei oder
89 // innerhalb des textes beziehen. vorsicht: innerhalb des textes kann
90 // verschiedene texte in der datei bedeuten.
91 // Count() gibt die anzahl der elemente zurueck. vorsicht bei
92 // n/n-1-feldern (word speichert strukturen gern in doppel-arrays, in
93 // denen das erste n elemente, das zweite jedoch n-1 elemente
95 // Fill() fuellt uebergebene referenzen mit daten aus den
97 // GetData() gibt zeiger auf den datenbereich zurueck
98 // GetError() gibt zurueck, ob fehler aufgetreten ist
99 // Start(), Stop(), Out(), op<< siehe modul w1filter
100 // Dump() siehe modul w1dump
103 /////////////////////////////////////////////////////////////////// Fib
105 // file information block: wurzel des uebels: steht am beginn der
106 // datei (seek(0)) und enthaelt alle positionen der strukturen der
116 friend ostream
& operator <<(ostream
&, Ww1Fib
&);
117 W1_FIB
& GetFIB() { return aFib
; }
118 BOOL
GetError() { return !bOK
; }
119 SvStream
& GetStream() { return rStream
; }
122 /////////////////////////////////////////////////////////////////// Dop
124 // document property: eigenschaften des gesamten dokuments
137 friend ostream
& operator <<(ostream
&, Ww1Dop
&);
141 ///////////////////////////////////////////////////////////// PlainText
143 // ww-dateien koennen mehrere textbloecke enthalten (main-text,
144 // fusznoten etc). PlainText vereinigt die gemeinsamkeiten
155 Ww1PlainText(Ww1Fib
& rWwFib
, ULONG nFilePos
, ULONG nCountBytes
);
156 // innerhalb des textes
157 ULONG
Where() const { return ulSeek
; }
158 void Seek( ULONG ulNew
)
160 DBG_ASSERT(ulNew
< ulCountBytes
, "Ww1PlainText");
161 if (ulNew
< ulCountBytes
)
165 ULONG
Count() const { return ulCountBytes
; }
166 void SetCount(ULONG ulNew
)
169 if (ulCountBytes
> ulNew
)
170 ulCountBytes
= ulNew
;
174 DBG_ASSERT(ulSeek
+1<ulCountBytes
, "Ww1PlainText");
177 BOOL
GetError() { return !bOK
; }
178 sal_Unicode
Out( Ww1Shell
&, ULONG
& );
179 sal_Unicode
Out( String
&, ULONG
=0xffffffff);
180 sal_Unicode
Out( sal_Unicode
& );
181 friend ostream
& operator <<(ostream
&, Ww1PlainText
&);
182 String
& Fill( String
&, ULONG
=0, ULONG
=0xffffffff );
183 sal_Unicode
operator []( ULONG
);
184 String
GetText( ULONG ulOffset
, ULONG nLen
) const;
186 enum Consts
{ MinChar
= 32 };
187 static BOOL
IsChar( sal_Unicode c
) { return c
>= MinChar
; }
190 /////////////////////////////////////////////////////////////// DocText
191 class Ww1DocText
: public Ww1PlainText
194 Ww1DocText(Ww1Fib
& rFibL
) :
195 Ww1PlainText(rFibL
, rFibL
.GetFIB().fcMinGet(),
196 rFibL
.GetFIB().ccpTextGet()) {
200 /////////////////////////////////////////////////////////////// FtnText
201 class Ww1FtnText
: public Ww1PlainText
204 ULONG
Offset(Ww1Fib
& rFibL
) {
205 return rFibL
.GetFIB().ccpTextGet(); }
206 Ww1FtnText(Ww1Fib
& rFibL
) :
207 Ww1PlainText(rFibL
, rFibL
.GetFIB().fcMinGet() +
208 Offset(rFibL
), rFibL
.GetFIB().ccpFtnGet()) {
212 /////////////////////////////////////////////////////////////// HddText
213 class Ww1HddText
: public Ww1PlainText
216 ULONG
Offset(Ww1Fib
& rFibL
) {
217 return rFibL
.GetFIB().ccpTextGet() + rFibL
.GetFIB().ccpFtnGet(); }
218 Ww1HddText(Ww1Fib
& rFibL
) :
219 Ww1PlainText(rFibL
, rFibL
.GetFIB().fcMinGet() +
220 Offset(rFibL
), rFibL
.GetFIB().ccpHddGet()) {
224 /////////////////////////////////////////////////////////////// McrText
225 class Ww1McrText
: public Ww1PlainText
228 ULONG
Offset(Ww1Fib
& rFibL
) {
229 return rFibL
.GetFIB().ccpTextGet() + rFibL
.GetFIB().ccpFtnGet()
230 + rFibL
.GetFIB().ccpHddGet(); }
231 Ww1McrText(Ww1Fib
& rFibL
) :
232 Ww1PlainText(rFibL
, rFibL
.GetFIB().fcMinGet() +
233 Offset(rFibL
), rFibL
.GetFIB().ccpMcrGet()) {
237 /////////////////////////////////////////////////////////////// AtnText
238 class Ww1AtnText
: public Ww1PlainText
241 ULONG
Offset(Ww1Fib
& rFibL
) {
242 return rFibL
.GetFIB().ccpTextGet() + rFibL
.GetFIB().ccpFtnGet()
243 + rFibL
.GetFIB().ccpHddGet() + rFibL
.GetFIB().ccpMcrGet(); }
244 Ww1AtnText(Ww1Fib
& rFibL
) :
245 Ww1PlainText(rFibL
, rFibL
.GetFIB().fcMinGet() +
246 Offset(rFibL
), rFibL
.GetFIB().ccpAtnGet()) {
250 ///////////////////////////////////////////////////////////////// Style
252 // ein einzelner style oder vorlage
259 Ww1StyleSheet
* pParent
;
266 BOOL
IsUsed() const { return bUsed
; }
267 void SetDefaults(BYTE
);
268 void SetParent(Ww1StyleSheet
* newParent
) { pParent
= newParent
; }
269 void SetName(const String
& rName
) { bUsed
= TRUE
; aName
= rName
; }
270 const String
& GetName() const { return aName
; }
271 // Ww1Style& GetNext();
273 USHORT
GetnBase() const { return stcBase
; }
274 USHORT
GetnNext() const { return stcNext
; }
275 USHORT
ReadName(BYTE
*&, USHORT
&, USHORT stc
);
276 USHORT
ReadChpx(BYTE
*&, USHORT
&);
277 USHORT
ReadPapx(BYTE
*&, USHORT
&);
278 USHORT
ReadEstcp(BYTE
*&, USHORT
&);
279 friend ostream
& operator <<(ostream
&, Ww1Style
&);
280 void Out(Ww1Shell
&, Ww1Manager
&);
283 //////////////////////////////////////////////////////////// StyleSheet
285 // die sammlung aller vorlagen (max. 256)
289 Ww1Style aStyles
[256];
290 USHORT cstcStd
; // count style code standard
293 USHORT
ReadNames(BYTE
*&, USHORT
&);
294 USHORT
ReadChpx(BYTE
*&, USHORT
&);
295 USHORT
ReadPapx(BYTE
*&, USHORT
&);
296 USHORT
ReadEstcp(BYTE
*&, USHORT
&);
298 void OutDefaults(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT stc
);
299 void OutOne(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT stc
);
300 void OutOneWithBase(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT stc
,
303 Ww1StyleSheet(Ww1Fib
& rFib
);
304 Ww1Style
& GetStyle(USHORT stc
) {
305 return aStyles
[stc
]; }
308 friend ostream
& operator <<(ostream
&, Ww1StyleSheet
&);
309 void Out(Ww1Shell
&, Ww1Manager
&);
310 friend class Ww1Style
;
315 ///////////////////////////////////////////////////////////////// Fonts
317 // ww kennt nur font-nummern beim formatieren. nebenher gibts ein
318 // array von fonts, damit man aus der nummer einen konkreten font
324 W1_FFN
** pFontA
; // Array of Pointers to Font Description
327 USHORT nMax
; // Array-Groesse
330 Ww1Fonts(Ww1Fib
&, ULONG nFieldFlgs
);
335 W1_FFN
* GetFFN(USHORT nNum
);
338 friend ostream
& operator <<(ostream
&, Ww1Fonts
&);
341 SvxFontItem
GetFont(USHORT
);
344 //////////////////////////////////////////////////////////// SingleSprm
346 // diese klassen ersetzen die aSprmTab etc des ww6-filters. die
347 // funktionspointer sind hier virtuale methoden, fuer die typen (byte,
348 // word, var-sized etc) gibt es abgeleitete klassen. diese haben
349 // methoden zum bestimmen der groesze, dumpen und shell-ausgeben der
351 // die klassen werden mit new (in InitTab()) erzeugt und nach ihrem
352 // code in die tabelle gestellt. zum aktivieren ruft man nun nur noch
353 // die entsprechende methode des objektes in der tabelle auf.
354 // wohlgemerkt: SingleSprms sind die _beschreibung_ und _funktion_ der
355 // Sprms, nicht deren inhalt. dieser musz uebergeben werden an die
356 // einzelnen methoden wie Size, Dump und Start/Stop.
363 // allein die virtuellen methoden stehen in der vtab, also je nachdem,
364 // ob fuer dumper oder filter uebersetzt wird ausblenden: das spart
365 // platz. ausserdem stehen die methoden fuer dumper bzw filter in
366 // verschiedenen modulen, die im jeweils anderen projekt nicht
367 // uebersetzt werden. das diese dann beim linken nicht zur verfuegung
368 // stehen faellt dann auch nicht auf. Der Namensstring ist nur im
369 // Dumper noetig: weg damit im Filter.
371 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
372 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
373 virtual ostream
& Dump(ostream
&, BYTE
*, USHORT
);
374 const sal_Char
* sName
;
376 virtual void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
377 virtual void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
378 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
380 virtual USHORT
Size(BYTE
*);
383 Ww1SingleSprm(USHORT nBytes
, const sal_Char
* /*pName*/ = 0 )
384 : nCountBytes(nBytes
)
392 class Ww1SingleSprmByteSized
: public Ww1SingleSprm
{
394 // ostream& Dump(ostream&, BYTE*, USHORT);
396 Ww1SingleSprmByteSized(USHORT nBytes
, sal_Char
* sName
= 0) :
397 Ww1SingleSprm(nBytes
, sName
) {
401 class Ww1SingleSprmWordSized
: public Ww1SingleSprm
{
403 // ostream& Dump(ostream&, BYTE*, USHORT);
405 Ww1SingleSprmWordSized(USHORT nBytes
, sal_Char
* sName
= 0) :
406 Ww1SingleSprm(nBytes
, sName
) {
410 class Ww1SingleSprmByte
: public Ww1SingleSprm
{
412 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
413 // USHORT Size(BYTE*);
414 Ww1SingleSprmByte(sal_Char
* sName
= 0) :
415 Ww1SingleSprm(1, sName
) {
419 class Ww1SingleSprmBool
: public Ww1SingleSprmByte
{
421 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
422 // USHORT Size(BYTE*);
423 Ww1SingleSprmBool(sal_Char
* sName
= 0) :
424 Ww1SingleSprmByte(sName
) {
428 class Ww1SingleSprm4State
: public Ww1SingleSprmByte
{
430 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
431 // USHORT Size(BYTE*);
432 Ww1SingleSprm4State(sal_Char
* sName
= 0) :
433 Ww1SingleSprmByte(sName
) {
437 class Ww1SingleSprmWord
: public Ww1SingleSprm
{
439 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
440 // USHORT Size(BYTE*);
441 Ww1SingleSprmWord(sal_Char
* sName
= 0)
442 : Ww1SingleSprm(2, sName
) {}
445 class Ww1SingleSprmLong
: public Ww1SingleSprm
{
447 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
448 // USHORT Size(BYTE*);
449 Ww1SingleSprmLong(sal_Char
* sName
= 0) :
450 Ww1SingleSprm(4, sName
) {
454 class Ww1SingleSprmTab
: public Ww1SingleSprm
{
456 ostream
& Dump(ostream
&, BYTE
*, USHORT
);
458 Ww1SingleSprmTab(USHORT nBytes
, sal_Char
* sName
= 0) :
459 Ww1SingleSprm(nBytes
, sName
) {
463 class Ww1SingleSprmPJc
: public Ww1SingleSprmByte
{
465 Ww1SingleSprmPJc(sal_Char
* sName
) :
466 Ww1SingleSprmByte(sName
) {
468 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
469 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
472 class Ww1SingleSprmPDxa
: public Ww1SingleSprmWord
{
474 Ww1SingleSprmPDxa(sal_Char
* sName
) :
475 Ww1SingleSprmWord(sName
) {
477 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
480 class Ww1SingleSprmPDxaRight
: public Ww1SingleSprmPDxa
{
482 Ww1SingleSprmPDxaRight(sal_Char
* sName
) :
483 Ww1SingleSprmPDxa(sName
) {
485 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
488 class Ww1SingleSprmPDxaLeft
: public Ww1SingleSprmPDxa
{
490 Ww1SingleSprmPDxaLeft(sal_Char
* sName
) :
491 Ww1SingleSprmPDxa(sName
) {
493 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
496 class Ww1SingleSprmPDxaLeft1
: public Ww1SingleSprmPDxa
{
498 Ww1SingleSprmPDxaLeft1(sal_Char
* sName
) :
499 Ww1SingleSprmPDxa(sName
) {
501 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
504 class Ww1SingleSprmPFKeep
: public Ww1SingleSprmBool
{
506 Ww1SingleSprmPFKeep(sal_Char
* sName
) :
507 Ww1SingleSprmBool(sName
) {
509 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
510 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
513 class Ww1SingleSprmPFKeepFollow
: public Ww1SingleSprmBool
{
515 Ww1SingleSprmPFKeepFollow(sal_Char
* sName
) :
516 Ww1SingleSprmBool(sName
) {
518 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
519 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
522 class Ww1SingleSprmPPageBreakBefore
: public Ww1SingleSprmBool
{
524 Ww1SingleSprmPPageBreakBefore(sal_Char
* sName
) :
525 Ww1SingleSprmBool(sName
) {
527 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
528 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
531 class Ww1SingleSprmPBrc
: public Ww1SingleSprmWord
{
533 // SvxBorderLine* SetBorder(SvxBorderLine*, W1_BRC*);
534 // spezielle start-routine, je nach sprm verschieden versorgt
535 // mit einem BoxItem.
536 void Start(Ww1Shell
&, BYTE
, W1_BRC10
*, USHORT
, Ww1Manager
&, SvxBoxItem
&);
537 void Start(Ww1Shell
&, BYTE
, W1_BRC
*, USHORT
, Ww1Manager
&, SvxBoxItem
&);
539 using Ww1SingleSprm::Start
;
542 Ww1SingleSprmPBrc(sal_Char
* sName
) :
543 Ww1SingleSprmWord(sName
) {
545 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
546 // SetBorder() wird auch fuer Tabellen gebraucht, deshalb public
547 static SvxBorderLine
* SetBorder(SvxBorderLine
*, W1_BRC10
*);
550 #define BRC_TOP ((USHORT)0)
551 #define BRC_LEFT ((USHORT)1)
552 #define BRC_BOTTOM ((USHORT)2)
553 #define BRC_RIGHT ((USHORT)3)
554 #define BRC_ANZ ((USHORT)BRC_RIGHT-BRC_TOP+1)
556 // Die BRC-struktur fuer 1.0 versionen von word sind verschieden von
557 // denen der folgenden versionen. diese werden zum glueck aber auch
558 // von anderen sprms abgerufen.
559 // SH: Ab sofort alle 4 Umrandungen ueber nur 1 Klasse.
560 class Ww1SingleSprmPBrc10
: public Ww1SingleSprmPBrc
562 USHORT nLine
; // BRC_TOP, BRC_LEFT, ...
564 using Ww1SingleSprmPBrc::Start
;
567 Ww1SingleSprmPBrc10(USHORT nL
, sal_Char
* sName
)
568 : Ww1SingleSprmPBrc(sName
), nLine(nL
) {}
570 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
573 class Ww1SingleSprmParaSpace
: public Ww1SingleSprmWord
{
575 Ww1SingleSprmParaSpace(sal_Char
* sName
)
576 : Ww1SingleSprmWord(sName
) {}
577 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
580 class Ww1SingleSprmPDyaBefore
: public Ww1SingleSprmParaSpace
{
582 Ww1SingleSprmPDyaBefore(sal_Char
* sName
)
583 : Ww1SingleSprmParaSpace(sName
) {}
584 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
587 class Ww1SingleSprmPDyaAfter
: public Ww1SingleSprmParaSpace
{
589 Ww1SingleSprmPDyaAfter(sal_Char
* sName
) :
590 Ww1SingleSprmParaSpace(sName
) {
592 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
595 class Ww1SingleSprmPDyaLine
: public Ww1SingleSprmWord
{
597 Ww1SingleSprmPDyaLine(sal_Char
* sName
) :
598 Ww1SingleSprmWord(sName
) {
600 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
601 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
604 class Ww1SingleSprmPChgTabsPapx
: public Ww1SingleSprmByteSized
{
606 Ww1SingleSprmPChgTabsPapx(sal_Char
* sName
) :
607 Ww1SingleSprmByteSized(0, sName
) {
609 // Size() ist noch nicht aktiviert !!
610 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
611 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
614 class Ww1SingleSprmSGprfIhdt
: public Ww1SingleSprmByte
{
616 Ww1SingleSprmSGprfIhdt(sal_Char
* sName
) :
617 Ww1SingleSprmByte(sName
) {
619 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
622 class Ww1SingleSprmSColumns
: public Ww1SingleSprmWord
{
624 Ww1SingleSprmSColumns(sal_Char
* sName
) :
625 Ww1SingleSprmWord(sName
) {
627 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
630 class Ww1SingleSprmPFInTable
: public Ww1SingleSprmBool
{
632 Ww1SingleSprmPFInTable(sal_Char
* sName
) :
633 Ww1SingleSprmBool(sName
) {
635 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
636 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
639 class Ww1SingleSprmPTtp
: public Ww1SingleSprmBool
{
641 Ww1SingleSprmPTtp(sal_Char
* sName
) :
642 Ww1SingleSprmBool(sName
) {
644 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
645 void Stop(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
648 class Ww1SingleSprmTJc
: public Ww1SingleSprmWord
{
650 Ww1SingleSprmTJc(sal_Char
* sName
)
651 : Ww1SingleSprmWord(sName
) {}
654 //class Ww1SingleSprmTDxaLeft : public Ww1SingleSprmWord {
656 // Ww1SingleSprmTDxaLeft(sal_Char* sName) :
657 // Ww1SingleSprmWord(sName) {
659 // void Start(Ww1Shell&, BYTE, BYTE*, USHORT, Ww1Manager&);
662 class Ww1SingleSprmTDxaGapHalf
: public Ww1SingleSprmWord
{
664 Ww1SingleSprmTDxaGapHalf(sal_Char
* sName
) :
665 Ww1SingleSprmWord(sName
) {
667 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
670 class Ww1SingleSprmTDefTable10
: public Ww1SingleSprmWordSized
{
672 Ww1SingleSprmTDefTable10(sal_Char
* sName
) :
673 Ww1SingleSprmWordSized(0, sName
) {
675 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
678 class Ww1SingleSprmTDyaRowHeight
: public Ww1SingleSprmWord
{
680 Ww1SingleSprmTDyaRowHeight(sal_Char
* sName
) :
681 Ww1SingleSprmWord(sName
) {
683 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
686 // Klassendefinitionen fuer Tabellen-Fastsave-Attribute
687 // Da wir kein Fastsave unterstuetzen, brauchen wir's nicht
691 class Ww1SingleSprmTInsert
: public Ww1SingleSprm
{
693 Ww1SingleSprmTInsert(sal_Char
* sName
) :
694 Ww1SingleSprm(4, sName
) {
696 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
699 class Ww1SingleSprmTDelete
: public Ww1SingleSprmWord
{
701 Ww1SingleSprmTDelete(sal_Char
* sName
) :
702 Ww1SingleSprmWord(sName
) {
704 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
707 class Ww1SingleSprmTDxaCol
: public Ww1SingleSprm
{
709 Ww1SingleSprmTDxaCol(sal_Char
* sName
) :
710 Ww1SingleSprm(4, sName
) {
712 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
715 class Ww1SingleSprmTMerge
: public Ww1SingleSprmWord
{
717 Ww1SingleSprmTMerge(sal_Char
* sName
) :
718 Ww1SingleSprmWord(sName
) {
720 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
723 class Ww1SingleSprmTSplit
: public Ww1SingleSprmWord
{
725 Ww1SingleSprmTSplit(sal_Char
* sName
) :
726 Ww1SingleSprmWord(sName
) {
728 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
731 class Ww1SingleSprmTSetBrc10
: public Ww1SingleSprm
{
733 Ww1SingleSprmTSetBrc10(sal_Char
* sName
) :
734 Ww1SingleSprm(5, sName
) {
736 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
740 // Klassendefinitionen fuer Apos ( == Flys )
742 class Ww1SingleSprmPpc
: public Ww1SingleSprmByte
{
744 Ww1SingleSprmPpc(sal_Char
* sName
) :
745 Ww1SingleSprmByte(sName
) {
747 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
750 class Ww1SingleSprmPDxaAbs
: public Ww1SingleSprmWord
{
752 Ww1SingleSprmPDxaAbs(sal_Char
* sName
) :
753 Ww1SingleSprmWord(sName
) {
755 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
758 class Ww1SingleSprmPDyaAbs
: public Ww1SingleSprmWord
{
760 Ww1SingleSprmPDyaAbs(sal_Char
* sName
) :
761 Ww1SingleSprmWord(sName
) {
763 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
766 class Ww1SingleSprmPDxaWidth
: public Ww1SingleSprmWord
{
768 Ww1SingleSprmPDxaWidth(sal_Char
* sName
) :
769 Ww1SingleSprmWord(sName
) {
771 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
774 class Ww1SingleSprmPFromText
: public Ww1SingleSprmWord
{
776 Ww1SingleSprmPFromText(sal_Char
* sName
) :
777 Ww1SingleSprmWord(sName
) {
779 void Start(Ww1Shell
&, BYTE
, BYTE
*, USHORT
, Ww1Manager
&);
782 ////////////////////////////////////////////////////////////////// Sprm
784 // der tatsaechlich in der datei auftretende datentyp Sprm
789 static Ww1SingleSprm
* aTab
[256];
790 static Ww1SingleSprm
* pSingleSprm
;
792 static void InitTab();
793 Ww1SingleSprm
& GetTab(USHORT nId
)
797 return aTab
[ nId
] ? *aTab
[nId
] : *pSingleSprm
;
805 // ohne Token, mit laengen-byte/word
806 USHORT
GetSize(BYTE nId
, BYTE
* pSprm
);
807 // mit Token und LaengenByte
808 USHORT
GetSizeBrutto(BYTE
* pSprm
) {
810 return GetSize(nId
, pSprm
) + 1; }
811 // gibt fuer nTh element id, size & zeiger auf daten:
812 // BOOL Fill(USHORT, BYTE&, USHORT&, BYTE*&);
814 // SH: brauche ich public
815 // gibt fuer nTh element id, size & zeiger auf daten:
816 BOOL
Fill(USHORT
, BYTE
&, USHORT
&, BYTE
*&);
818 Ww1Sprm(BYTE
*, USHORT
);
819 Ww1Sprm(SvStream
&, ULONG
);
821 friend ostream
& operator <<(ostream
&, Ww1Sprm
&);
822 void Start(Ww1Shell
&, Ww1Manager
&);
823 void Start(Ww1Shell
&, Ww1Manager
&, USHORT
);
824 void Stop(Ww1Shell
&, Ww1Manager
&);
826 return nCountBytes
!= 255; }
831 static void DeinitTab();
834 /////////////////////////////////////////////////////////////// Picture
836 // der wrapper um den datentyp PIC, eine struktur, die am beginn eines
837 // bild-dateinamens oder eines eingebetteten bildes steht.
844 Ww1Picture(SvStream
&, ULONG
);
849 friend ostream
& operator <<(ostream
&, Ww1Picture
&);
850 void Out(Ww1Shell
&, Ww1Manager
&);
851 void WriteBmp(SvStream
&);
854 /////////////////////////////////////////////////////////////////// Plc
856 // eine der wichtigen array-strukturen der ww-dateien. sie beinhalten
857 // n+1 dateipositionen und n attribute, die zwischen den
858 // dateipositionen gelten.
869 BYTE
* GetData(USHORT
);
871 Ww1Plc(Ww1Fib
&, ULONG
, USHORT
, USHORT
);
873 friend ostream
& operator <<(ostream
&, Ww1Plc
&);
874 ULONG
Where(USHORT
); // wie im jeweiligen plc
875 void Seek(ULONG
, USHORT
&);
876 void Fill(USHORT nIndex
, ULONG
& begin
, ULONG
& end
) {
877 begin
= Where(nIndex
);
878 end
= Where(nIndex
+1); }
885 // Size Tabs from Sven:
886 // CHP, PAP, SEP, HED, FNR, FNT
887 //Plc 2, 2, 6, 0, 2, 0
888 //Fkp 1, 1, 0, 0, 0, 0
890 /////////////////////////////////////////////////////////// PlcGlossary
891 class Ww1PlcGlossary
: public Ww1Plc
894 Ww1PlcGlossary(Ww1Fib
& rFibL
) :
895 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfglsyGet(),
896 rFibL
.GetFIB().cbPlcfglsyGet(), 0) {
900 ////////////////////////////////////////////////////// PlcAnnotationRef
901 class Ww1PlcAnnotationRef
: public Ww1Plc
904 Ww1PlcAnnotationRef(Ww1Fib
& rFibL
) :
905 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfandRefGet(),
906 rFibL
.GetFIB().cbPlcfandRefGet(), 0) {
910 ////////////////////////////////////////////////////// PlcAnnotationTxt
911 class Ww1PlcAnnotationTxt
: public Ww1Plc
914 Ww1PlcAnnotationTxt(Ww1Fib
& rFibL
) :
915 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfandTxtGet(),
916 rFibL
.GetFIB().cbPlcfandTxtGet(), 0) {
920 ///////////////////////////////////////////////////////// PlcAnnotation
921 class Ww1Annotation
{
922 Ww1PlcAnnotationRef aRef
;
923 Ww1PlcAnnotationTxt aTxt
;
925 Ww1Annotation(Ww1Fib
& rFib
) :
929 friend ostream
& operator <<(ostream
&, Ww1Annotation
&);
932 //////////////////////////////////////////////////////////////// PlcSep
933 class Ww1PlcSep
: public Ww1Plc
936 Ww1PlcSep(Ww1Fib
& rFibL
):
937 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfsedGet(),
938 rFibL
.GetFIB().cbPlcfsedGet(), 6) {
940 friend ostream
& operator <<(ostream
&, Ww1PlcSep
&);
943 //////////////////////////////////////////////////////////////// PlcChp
944 class Ww1PlcChp
: public Ww1Plc
947 Ww1PlcChp(Ww1Fib
& rFibL
) :
948 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfbteChpxGet(),
949 rFibL
.GetFIB().cbPlcfbteChpxGet(), 2) {
951 friend ostream
& operator <<(ostream
&, Ww1PlcChp
&);
954 //////////////////////////////////////////////////////////////// PlcPap
955 class Ww1PlcPap
: public Ww1Plc
958 Ww1PlcPap(Ww1Fib
& rFibL
) :
959 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfbtePapxGet(),
960 rFibL
.GetFIB().cbPlcfbtePapxGet(), 2) {
962 friend ostream
& operator <<(ostream
&, Ww1PlcPap
&);
965 //////////////////////////////////////////////////////// PlcFootnoteRef
966 class Ww1PlcFootnoteRef
: public Ww1Plc
969 Ww1PlcFootnoteRef(Ww1Fib
& rFibL
) :
970 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcffndRefGet(),
971 rFibL
.GetFIB().cbPlcffndRefGet(), 2) {
973 friend ostream
& operator <<(ostream
&, Ww1PlcFootnoteRef
&);
976 //////////////////////////////////////////////////////// PlcFootnoteTxt
977 class Ww1PlcFootnoteTxt
: public Ww1Plc
980 Ww1PlcFootnoteTxt(Ww1Fib
& rFibL
) :
981 Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcffndTxtGet(),
982 rFibL
.GetFIB().cbPlcffndTxtGet(), 0) {
984 friend ostream
& operator <<(ostream
&, Ww1PlcFootnoteTxt
&);
987 ///////////////////////////////////////////////////////////// PlcFields
988 class Ww1PlcFields
: public Ww1Plc
990 //USHORT Fill(USHORT, BYTE&, String&, String&, String&);
992 Ww1PlcFields(Ww1Fib
& rFibL
, ULONG start
, USHORT nBytes
)
993 : Ww1Plc(rFibL
, start
, nBytes
, 2)
995 W1_FLD
* GetData(USHORT nIndex
)
996 { return (W1_FLD
*)Ww1Plc::GetData(nIndex
); }
997 ULONG
Where(USHORT nIndex
) // absolut im file
998 { return Ww1Plc::Where(nIndex
) + rFib
.GetFIB().fcMinGet(); }
999 friend ostream
& operator <<(ostream
&, Ww1PlcFields
&);
1002 ///////////////////////////////////////////////////////////// PlcBookmarks
1008 Ww1StringList( SvStream
& rSt
, ULONG nFc
, USHORT nCb
);
1010 { if( pIdxA
) { delete pIdxA
[0]; delete pIdxA
; } }
1011 const String
GetStr( USHORT nNum
) const;
1012 USHORT
Count() const { return nMax
; }
1013 BOOL
GetError() const { return (nMax
!= 0) && !pIdxA
; }
1016 class Ww1PlcBookmarkTxt
: public Ww1StringList
1019 Ww1PlcBookmarkTxt(Ww1Fib
& rFib
) :
1020 Ww1StringList( rFib
.GetStream(), rFib
.GetFIB().fcSttbfbkmkGet(),
1021 rFib
.GetFIB().cbSttbfbkmkGet() )
1025 class Ww1PlcBookmarkPos
: public Ww1Plc
1027 // USHORT Fill(USHORT, BYTE&, String&, String&, String&);
1029 Ww1PlcBookmarkPos(Ww1Fib
& _rFib
, ULONG start
, USHORT nBytes
, BOOL bEnd
)
1030 : Ww1Plc(_rFib
, start
, nBytes
, (bEnd
) ? 0 : 2)
1033 BYTE
* GetData(USHORT nIndex
) { return Ww1Plc::GetData(nIndex
); }
1035 ULONG
WhereCP(USHORT nIndex
) { return Ww1Plc::Where(nIndex
); }
1037 ULONG
Where(USHORT nIndex
)
1039 return ( nIndex
< Count() )
1040 ? Ww1Plc::Where(nIndex
) + rFib
.GetFIB().fcMinGet()
1043 // friend ostream& operator <<(ostream&, Ww1PlcBookmarks&);
1046 //////////////////////////////////////////////////////////////// PlcHdd
1047 class Ww1PlcHdd
: public Ww1Plc
1050 Ww1PlcHdd(Ww1Fib
& rFibL
)
1051 : Ww1Plc(rFibL
, rFibL
.GetFIB().fcPlcfhddGet(),
1052 rFibL
.GetFIB().cbPlcfhddGet(), 0)
1056 /////////////////////////////////////////////////////////////////// Fkp
1058 // aehnlich den plcs aufgebaute arrays, die sich auf eine groesze von
1059 // 512 byte beschraenken.
1067 BYTE
* GetData(USHORT
);
1069 Ww1Fkp(SvStream
&, ULONG
, USHORT
);
1070 friend ostream
& operator <<(ostream
&, Ww1Fkp
&);
1071 USHORT
Count() const { return SVBT8ToByte(aFkp
+511); }
1072 ULONG
Where(USHORT
); // wie im entsprechenden fkp
1075 //////////////////////////////////////////////////////////////// FkpPap
1076 class Ww1FkpPap
: public Ww1Fkp
1079 Ww1FkpPap(SvStream
& rStream
, ULONG ulFilePos
)
1080 : Ww1Fkp(rStream
, ulFilePos
, 1)
1082 friend ostream
& operator <<(ostream
&, Ww1FkpPap
&);
1083 BOOL
Fill(USHORT
, BYTE
*&, USHORT
&);
1086 //////////////////////////////////////////////////////////////// FkpChp
1087 class Ww1FkpChp
: public Ww1Fkp
1091 SvStream
& GetStream() { return rStream
; }
1094 Ww1FkpChp(SvStream
& rStream
, ULONG ulFilePos
)
1095 : Ww1Fkp(rStream
, ulFilePos
, 1)
1101 friend ostream
& operator <<(ostream
&, Ww1FkpChp
&);
1102 BOOL
Fill(USHORT
, W1_CHP
&);
1105 ////////////////////////////////////////////////////////////// SprmPapx
1106 class Ww1SprmPapx
: public Ww1Sprm
1109 BYTE
* Sprm(BYTE
* p
, USHORT nSize
);
1110 USHORT
SprmSize(BYTE
* p
, USHORT nSize
);
1112 Ww1SprmPapx(BYTE
* p
, USHORT nSize
);
1113 friend ostream
& operator <<(ostream
&, Ww1SprmPapx
&);
1114 void Start(Ww1Shell
&, Ww1Manager
&);
1115 void Stop(Ww1Shell
&, Ww1Manager
&);
1118 /////////////////////////////////////////////////////////////// SprmSep
1119 class Ww1SprmSep
: public Ww1Sprm
1122 Ww1SprmSep(Ww1Fib
& rFib
, ULONG ulFilePos
)
1123 : Ww1Sprm(rFib
.GetStream(), ulFilePos
)
1125 friend ostream
& operator <<(ostream
&, Ww1SprmSep
&);
1128 ///////////////////////////////////////////////////////////////// Assoc
1131 enum fields
{ FileNext
, Dot
, Title
, Subject
, KeyWords
, Comments
,
1132 Author
, LastRevBy
, DataDoc
, HeaderDoc
, Criteria1
, Criteria2
,
1133 Criteria3
, Criteria4
, Criteria5
, Criteria6
, Criteria7
, MaxFields
};
1137 sal_Char
* pStrTbl
[ MaxFields
];
1140 String
GetStr(USHORT
);
1144 ~Ww1Assoc() { delete pBuffer
; }
1145 BOOL
GetError() const { return !bOK
; }
1146 friend ostream
& operator <<(ostream
&, Ww1Assoc
&);
1147 void Out(Ww1Shell
&);
1150 ////////////////////////////////////////////////////////// HeaderFooter
1152 // Header/Footer/Footnoteseparators sind einer nach dem naechsten in
1153 // einem eigenen text gespeichert. ein plc trennt diesen text in
1154 // einzelne teile. diese werden durchnummeriert als ihdd. nun gibt es
1155 // 9 verschiedene funktionen fuer diese texte. wird eine davon
1156 // angefordert, ist es der erste, beim naechstern der 2 ihdd und so
1157 // weiter. welcher textteil also welcher typ sein wird laeszt sich
1158 // nur bei sequenziellem lesen der datei bestimmen. die 9 typen sind:
1159 // fusznoten-trenner, folge-fusznoten-trenner, folge-fusznoten-notiz,
1160 // gerade-seiten kopfzeilen, ungerade seiten kopfzeilen, dto 2*
1161 // fuszzeilen, kopf & fuszzeilen, wenn erste seite andere zeilen hat.
1162 // HeaderFooter merkt sich fuer jede der 9 die momentane einstellung
1163 // (jedoch nicht die alten) und den naechstvergebbaren ihdd. ist ein
1164 // teil nicht vorhanden bekommt er den wert 0xffff.
1166 class Ww1HeaderFooter
: public Ww1PlcHdd
1168 USHORT nextIhdd
; // naechster textteil im HddText
1169 USHORT nFtnSep
; // fusznoten trenner
1170 USHORT nFtnFollowSep
; // folge fusznoten trenner
1171 USHORT nFtnNote
; // folgefunsznotennotiz
1172 USHORT nEvenHeadL
; // kopfzeilen grader seiten
1173 USHORT nOddHeadL
; // kopfzeilen ungrader seiten
1174 USHORT nEvenFootL
; // fuszzeilen grader seiten
1175 USHORT nOddFootL
; // fuszzeilen ungerader seiten
1176 USHORT nFirstHeadL
; // kopfzeilen der ersten seite
1177 USHORT nFirstFootL
; // fuszzeilen der ersten seite
1178 enum HeaderFooterMode
{
1179 None
, FtnSep
, FtnFollowSep
, FtnNote
, EvenHeadL
, OddHeadL
,
1180 EvenFootL
, OddFootL
, FirstHeadL
, MaxHeaderFooterMode
1181 } eHeaderFooterMode
;
1184 Ww1HeaderFooter(Ww1Fib
& rFibL
, USHORT grpfIhdt
)
1188 nFtnFollowSep(0xffff),
1194 nFirstHeadL(0xffff),
1195 nFirstFootL(0xffff),
1196 eHeaderFooterMode(None
)
1198 if (grpfIhdt
& 0x0001) nFtnSep
= nextIhdd
++;
1199 if (grpfIhdt
& 0x0002) nFtnFollowSep
= nextIhdd
++;
1200 if (grpfIhdt
& 0x0004) nFtnNote
= nextIhdd
++;
1202 // ~Ww1HeaderFooter() {}
1203 void SetGrpfIhdt(USHORT grpfIhdt
)
1205 if (grpfIhdt
& 0x0001) nEvenHeadL
= nextIhdd
++;
1206 if (grpfIhdt
& 0x0002) nOddHeadL
= nextIhdd
++;
1207 if (grpfIhdt
& 0x0004) nEvenFootL
= nextIhdd
++;
1208 if (grpfIhdt
& 0x0008) nOddFootL
= nextIhdd
++;
1209 if (grpfIhdt
& 0x0010) nFirstHeadL
= nextIhdd
++;
1210 if (grpfIhdt
& 0x0020) nFirstFootL
= nextIhdd
++;
1211 DBG_ASSERT(nextIhdd
<=Count(), "Ww1HeaderFooter");
1213 BOOL
operator++(int)
1216 eHeaderFooterMode
= (HeaderFooterMode
)((short)eHeaderFooterMode
+ 1);
1217 if( eHeaderFooterMode
== MaxHeaderFooterMode
)
1219 eHeaderFooterMode
= None
;
1224 BOOL
FillFtnSep(ULONG
& begin
, ULONG
& end
)
1226 if (nFtnSep
== 0xffff)
1228 Fill(nFtnSep
, begin
, end
);
1231 BOOL
FillFtnFollowSep(ULONG
& begin
, ULONG
& end
)
1233 if (nFtnFollowSep
== 0xffff)
1235 Fill(nFtnFollowSep
, begin
, end
);
1238 BOOL
FillFtnNote(ULONG
& begin
, ULONG
& end
)
1240 if (nFtnNote
== 0xffff)
1242 Fill(nFtnNote
, begin
, end
);
1245 BOOL
FillEvenHeadL(ULONG
& begin
, ULONG
& end
)
1247 if (nEvenHeadL
== 0xffff)
1249 Fill(nEvenHeadL
, begin
, end
);
1252 BOOL
FillOddHeadL(ULONG
& begin
, ULONG
& end
)
1254 if (nOddHeadL
== 0xffff)
1256 Fill(nOddHeadL
, begin
, end
);
1259 BOOL
FillEvenFootL(ULONG
& begin
, ULONG
& end
)
1261 if (nEvenFootL
== 0xffff)
1263 Fill(nEvenFootL
, begin
, end
);
1266 BOOL
FillOddFootL(ULONG
& begin
, ULONG
& end
)
1268 if (nOddFootL
== 0xffff)
1270 Fill(nOddFootL
, begin
, end
);
1273 BOOL
FillFirstHeadL(ULONG
& begin
, ULONG
& end
)
1275 if (nFirstHeadL
== 0xffff)
1277 Fill(nFirstHeadL
, begin
, end
);
1280 BOOL
FillFirstFootL(ULONG
& begin
, ULONG
& end
)
1282 if (nFirstFootL
== 0xffff)
1284 Fill(nFirstFootL
, begin
, end
);
1287 void Start(Ww1Shell
&, Ww1Manager
&);
1288 void Stop(Ww1Shell
&, Ww1Manager
&, sal_Unicode
&);
1291 //////////////////////////////////////////////////////////////// Fields
1292 class Ww1Fields
: public Ww1PlcFields
1295 String sErgebnis
; // das von word errechnete ergebniss
1297 ULONG
Where(USHORT nIndex
) // innerhalb des textes
1298 { return Ww1PlcFields::Where(nIndex
) - rFib
.GetFIB().fcMinGet(); }
1301 Ww1Fields(Ww1Fib
& rFibL
, ULONG ulFilePos
, USHORT nBytes
)
1302 : Ww1PlcFields(rFibL
, ulFilePos
, nBytes
), nPlcIndex(0), pField(0)
1305 // innerhalb des textes
1306 ULONG
Where() { return Where(nPlcIndex
); }
1307 void operator++(int)
1309 DBG_ASSERT(nPlcIndex
+1 <= Count(), "Ww1Fields");
1312 void Seek(ULONG ulNew
) { Ww1PlcFields::Seek(ulNew
, nPlcIndex
); }
1315 DBG_ASSERT(nPlcIndex
< Count(), "Ww1Fields");
1316 return Ww1PlcFields::GetData(nPlcIndex
);
1319 friend ostream
& operator <<(ostream
&, Ww1Manager
&);
1320 void Start(Ww1Shell
&, Ww1Manager
&);
1321 void Stop(Ww1Shell
&, Ww1Manager
&, sal_Unicode
&);
1322 void Out(Ww1Shell
&, Ww1Manager
&, USHORT
=0);
1325 class Ww1TextFields
: public Ww1Fields
1328 Ww1TextFields(Ww1Fib
& rFibL
)
1329 : Ww1Fields(rFibL
, rFibL
.GetFIB().fcPlcffldMomGet(),
1330 rFibL
.GetFIB().cbPlcffldMomGet())
1334 class Ww1FootnoteFields
: public Ww1Fields
1337 Ww1FootnoteFields(Ww1Fib
& rFibL
)
1338 : Ww1Fields(rFibL
, rFibL
.GetFIB().fcPlcffldFtnGet(),
1339 rFibL
.GetFIB().cbPlcffldFtnGet())
1343 class Ww1HeaderFooterFields
: public Ww1Fields
1346 Ww1HeaderFooterFields(Ww1Fib
& rFibL
)
1347 : Ww1Fields(rFibL
, rFibL
.GetFIB().fcPlcffldHdrGet(),
1348 rFibL
.GetFIB().cbPlcffldHdrGet())
1352 class Ww1MacroFields
: public Ww1Fields
1355 Ww1MacroFields(Ww1Fib
& rFibL
)
1356 : Ww1Fields(rFibL
, rFibL
.GetFIB().fcPlcffldMcrGet(),
1357 rFibL
.GetFIB().cbPlcffldMcrGet())
1361 //////////////////////////////////////////////////////////////// Bookmarks
1364 Ww1PlcBookmarkTxt aNames
;
1365 Ww1PlcBookmarkPos
* pPos
[2];
1371 // ULONG Where(USHORT nIndex) { // innerhalb des textes
1372 // return Ww1PlcFields::Where(nIndex) - rFib.GetFIB().fcMinGet(); }
1374 Ww1Bookmarks(Ww1Fib
& rFib
);
1380 ULONG
Where() const { return pPos
[nIsEnd
]->WhereCP(nPlcIdx
[nIsEnd
]); }
1381 void operator++(int);
1382 BOOL
GetError() const { return !bOK
; }
1383 long GetHandle() const;
1384 BOOL
GetIsEnd() const { return ( nIsEnd
) ? TRUE
: FALSE
; }
1385 const String
GetName() const;
1387 friend ostream
& operator <<(ostream
&, Ww1Bookmarks
&);
1388 void Start(Ww1Shell
&, Ww1Manager
&);
1389 void Stop(Ww1Shell
&, Ww1Manager
&, sal_Unicode
&);
1390 void Out(Ww1Shell
&, Ww1Manager
&, USHORT
=0);
1393 ///////////////////////////////////////////////////////////// Footnotes
1394 class Ww1Footnotes
: public Ww1PlcFootnoteRef
1397 Ww1PlcFootnoteTxt aText
;
1400 Ww1Footnotes(Ww1Fib
& rFibL
)
1401 : Ww1PlcFootnoteRef(rFibL
), nPlcIndex(0), aText(rFibL
), bStarted(FALSE
)
1403 // ~Ww1Footnotes() {}
1404 // innerhalb des textes
1407 ULONG ulRet
= 0xffffffff;
1409 ulRet
= Ww1PlcFootnoteRef::Where(nPlcIndex
);
1412 void operator++(int)
1414 DBG_ASSERT(nPlcIndex
+1 <= Count(), "Ww1Footnotes");
1417 void Start(Ww1Shell
&, Ww1Manager
&);
1418 void Stop(Ww1Shell
&, Ww1Manager
&, sal_Unicode
&);
1421 /////////////////////////////////////////////////////////////////// Sep
1422 class Ww1Sep
: public Ww1PlcSep
1424 Ww1HeaderFooter aHdd
;
1427 Ww1Sep(Ww1Fib
& rFibL
, USHORT grpfIhdt
)
1428 : Ww1PlcSep(rFibL
), aHdd(rFibL
, grpfIhdt
), nPlcIndex(0) {}
1430 Ww1HeaderFooter
& GetHdd() { return aHdd
; }
1431 void operator++(int) { nPlcIndex
++; }
1432 BYTE
* GetData() { return Ww1PlcSep::GetData(nPlcIndex
); }
1433 // innerhalb des textes
1434 ULONG
Where() { return Ww1PlcSep::Where(nPlcIndex
); }
1435 void SetGrpfIhdt(BYTE grpfIhdt
)
1437 GetHdd().SetGrpfIhdt(grpfIhdt
);
1438 // GetHdd().Start(rOut, rMan);
1440 void Start(Ww1Shell
&, Ww1Manager
&);
1441 void Stop(Ww1Shell
& rOut
, Ww1Manager
& rMan
, sal_Unicode
& c
)
1442 { aHdd
.Stop(rOut
, rMan
, c
); }
1445 /////////////////////////////////////////////////////////////////// Pap
1446 class Ww1Pap
: public Ww1PlcPap
1449 USHORT nPushedPlcIndex
;
1451 USHORT nPushedFkpIndex
;
1455 BOOL
FindSprm(USHORT nId
, BYTE
* pStart
, BYTE
* pEnd
);
1458 if (pPap
&& nFkpIndex
>= pPap
->Count() )
1467 BOOL
HasId0(USHORT nId
);
1470 Ww1Pap(Ww1Fib
& rFib
);
1471 ~Ww1Pap() { delete pPap
; }
1472 ULONG
Where( BOOL bSetIndex
= TRUE
); // innerhalb des textes
1473 void operator++(int);
1474 BOOL
FillStart(BYTE
*& pB
, USHORT
& nSize
)
1477 return pPap
->Fill(nFkpIndex
, pB
, nSize
);
1479 BOOL
FillStop(BYTE
*& pB
, USHORT
& nSize
)
1481 return nFkpIndex
? pPap
->Fill(nFkpIndex
-1, pB
, nSize
) : FALSE
;
1483 void Start(Ww1Shell
&, Ww1Manager
&);
1484 void Stop(Ww1Shell
&, Ww1Manager
&, sal_Unicode
&);
1486 void Push(ULONG ulOffsetTmp
= 0)
1488 DBG_ASSERT(!Pushed(), "Ww1Pap");
1489 nPushedPlcIndex
= nPlcIndex
;
1490 nPushedFkpIndex
= nFkpIndex
;
1492 ulOffset
= ulOffsetTmp
;
1498 return nPushedPlcIndex
!= 0xffff;
1502 DBG_ASSERT(Pushed(), "Ww1Pap");
1504 nPlcIndex
= nPushedPlcIndex
;
1505 nFkpIndex
= nPushedFkpIndex
;
1506 nPushedPlcIndex
= 0xffff;
1507 nPushedFkpIndex
= 0xffff;
1512 BOOL
HasId(USHORT nId
);
1515 /////////////////////////////////////////////////////////////////// Chp
1516 class Ww1Chp
: public Ww1PlcChp
1519 USHORT nPushedPlcIndex
;
1521 USHORT nPushedFkpIndex
;
1526 if (pChp
&& nFkpIndex
>= pChp
->Count() )
1537 Ww1Chp( Ww1Fib
& rFib
);
1538 ~Ww1Chp() { delete pChp
; }
1539 ULONG
Where( BOOL bSetIndex
= TRUE
); // innerhalb des textes
1540 void operator++(int);
1541 BOOL
FillStart(W1_CHP
& rChp
)
1544 return pChp
->Fill(nFkpIndex
, rChp
);
1546 BOOL
FillStop(W1_CHP
& rChp
)
1547 { return nFkpIndex
? pChp
->Fill(nFkpIndex
-1, rChp
) : FALSE
; }
1548 void Start(Ww1Shell
&, Ww1Manager
&);
1549 void Stop(Ww1Shell
&, Ww1Manager
&, sal_Unicode
&);
1551 void Push(ULONG ulOffsetTmp
= 0)
1553 DBG_ASSERT(!Pushed(), "Ww1Chp");
1554 nPushedPlcIndex
= nPlcIndex
;
1555 nPushedFkpIndex
= nFkpIndex
;
1557 ulOffset
= ulOffsetTmp
;
1561 BOOL
Pushed() { return nPushedPlcIndex
!= 0xffff; }
1564 DBG_ASSERT(Pushed(), "Ww1Chp");
1566 nPlcIndex
= nPushedPlcIndex
;
1567 nFkpIndex
= nPushedFkpIndex
;
1568 nPushedPlcIndex
= 0xffff;
1569 nPushedFkpIndex
= 0xffff;
1576 /////////////////////////////////////////////////////////////// Manager
1578 // zentraler aufhaenger der ww-seite des filters, konstruiert aus dem
1579 // inputstream (ww-datei) enthaelt er alles, was noetig ist, um in die
1580 // shell (pm-seite) gepiped zu werden.
1591 // ab jetzt alles paarig, fuer 'pushed':
1598 // selbst 'push'bar:
1601 // nicht in textbereichen vorhanden, wenn ge'pushed'
1603 Ww1Bookmarks aBooks
;
1606 void OutStop( Ww1Shell
&, sal_Unicode
);
1607 void OutStart( Ww1Shell
& );
1608 void Out(Ww1Shell
&, sal_Unicode
);
1611 Ww1Manager(SvStream
& rStrm
, ULONG nFieldFlgs
);
1612 BOOL
GetError() const { return !bOK
; }
1615 void SetInTtp(BOOL bSet
= TRUE
) { bInTtp
= bSet
; }
1616 BOOL
IsInTtp() const { return bInTtp
; }
1617 void SetInStyle(BOOL bSet
= TRUE
) { bInStyle
= bSet
; }
1618 BOOL
IsInStyle() const { return bInStyle
; }
1619 void SetStopAll(BOOL bSet
= TRUE
) { bStopAll
= bSet
; }
1620 BOOL
IsStopAll() const { return bStopAll
; }
1629 Ww1Fib
& GetFib() { return aFib
; }
1630 Ww1PlainText
& GetText() { return *pDoc
; }
1631 Ww1Dop
& GetDop() { return aDop
; }
1632 Ww1Sep
& GetSep() { return aSep
; }
1633 // innerhalb des textes
1634 ULONG
Where() { return pDoc
->Where(); }
1635 void Fill( sal_Unicode
& rChr
) { pDoc
->Out( rChr
); }
1636 BYTE
Fill( String
& rStr
, ULONG ulLen
)
1638 ulLen
+= pDoc
->Where();
1639 return sal::static_int_cast
< BYTE
>(pDoc
->Out(rStr
, ulLen
));
1641 SvxFontItem
GetFont(USHORT nFCode
);
1642 friend Ww1Shell
& operator <<(Ww1Shell
&, Ww1Manager
&);
1643 friend ostream
& operator <<(ostream
&, Ww1Manager
&);
1644 BOOL
Pushed() { return pDoc
!= &aDoc
; }
1646 void Push0(Ww1PlainText
* pDoc
, ULONG
, Ww1Fields
* = 0);
1647 void Push1(Ww1PlainText
* pDoc
, ULONG ulSeek
, ULONG ulSeek2
= 0,