1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: w1filter.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sw.hxx"
33 #include <hintids.hxx>
35 #include <tools/solar.h>
36 #include <comphelper/string.hxx>
37 #include <svx/paperinf.hxx>
38 #include <svtools/filter.hxx>
39 #ifndef _GRAPH_HXX //autogen
40 #include <vcl/graph.hxx>
42 #include <svx/fontitem.hxx>
43 #include <svx/lrspitem.hxx>
44 #include <svx/ulspitem.hxx>
45 #include <svx/wghtitem.hxx>
46 #include <svx/postitem.hxx>
47 #include <svx/crsditem.hxx>
48 #ifndef _SVX_CNTRITEM_HXX //autogen
49 #include <svx/cntritem.hxx>
51 #include <svx/cmapitem.hxx>
52 #include <svx/fhgtitem.hxx>
53 #include <svx/udlnitem.hxx>
54 #include <svx/wrlmitem.hxx>
55 #include <svx/colritem.hxx>
56 #include <svx/kernitem.hxx>
57 #include <svx/escpitem.hxx>
58 #ifndef _SVX_TSTPITEM_HXX //autogen
59 #include <svx/tstpitem.hxx>
61 #include <svtools/urihelper.hxx>
62 #include <fmtfsize.hxx>
66 #include <pagedesc.hxx>
70 #include <docufld.hxx>
71 #include <ftninfo.hxx>
72 #include <section.hxx> // class SwSection
80 #include <statstr.hrc>
82 #if OSL_DEBUG_LEVEL > 1
86 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
87 #include <com/sun/star/document/XDocumentProperties.hpp>
89 #define MAX_FIELDLEN 64000
91 using namespace nsSwDocInfoSubType
;
94 ///////////////////////////////////////////////////////////////////////
96 // hier stehen die methoden operator<<, Out, Start und Stop mit
97 // folgender Bedeutung: wenn moeglich wird die information aus dem
100 // in die shell uebertragen. sind jedoch weitere parameter noetig
103 // gewaehlt. ist ein bereich zu kennzeichnen (zB bei attributen
104 // von/bis), heissen die methoden
106 // alle diese methoden stehen in diesem modul, das fuer den filter,
107 // jedoch nicht fuer den dumper noetig ist. und da alle regeln ihre
108 // ausnahme haben: hier stehen auch methoden, die aus anderen gruenden
109 // fuer den dumper sinnlos sind, zB wenn sie auf sv-strukturen beruhen
110 // wie zB GetFont() auf SvxFontItem.
113 /////////////////////////////////////////////////////////////// Manager
114 Ww1Shell
& operator <<(Ww1Shell
& rOut
, Ww1Manager
& This
)
116 // verhindern, das bei rekusivem aufruf dies mehrfach passiert:
119 { // der wird nur temporaer gebraucht:
120 This
.SetInStyle( TRUE
);
121 Ww1StyleSheet(This
.aFib
).Out(rOut
, This
);
122 This
.SetInStyle( FALSE
);
125 Ww1Assoc(This
.aFib
).Out(rOut
);
127 // dieser nicht, der ist bereits member:
129 // Jetzt entscheiden, wie Seitenvorlagen erzeugt werden
130 if (This
.GetSep().Count() <= 1)
131 rOut
.SetUseStdPageDesc();
133 // und jetzt das eigentliche dok:
134 sal_Unicode cUnknown
= ' ';
135 while (*This
.pSeek
< This
.pDoc
->Count())
137 // ausgabe des ProgressState nur, wenn im haupttext, da sonst
138 // nicht bestimmt werden kann, wie weit wir sind:
140 ::SetProgressState(This
.Where() * 100 / This
.pDoc
->Count(),
141 rOut
.GetDoc().GetDocShell());
142 // hier werden abwechselnd die attribute und die zeichen in die
143 // shell gepumpt. die positionen werden durch das lesen der
144 // zeichen aus dem manager hoch- gezaehlt. erst alle attribute:
145 This
.Out(rOut
, cUnknown
);
146 // das textdocument pDoc ist ein Ww1PlainText, dessen Out()
147 // methode solange ausgibt, bis entweder ein sonderzeichen
148 // auftaucht oder die anzahl der auszugebenden zeichen erreicht
150 cUnknown
= This
.pDoc
->Out(rOut
, *This
.pSeek
);
152 This
.SetStopAll(TRUE
);
153 This
.OutStop(rOut
, cUnknown
); // Damit die Attribute am Ende geschlossen
154 This
.SetStopAll(FALSE
); // werden
158 void Ww1Manager::OutStop(Ww1Shell
& rOut
, sal_Unicode cUnknown
)
160 // Bookmarks brauchen nicht beendet werden ???
162 pFld
->Stop(rOut
, *this, cUnknown
);
164 aFtn
.Stop(rOut
, *this, cUnknown
);
166 aChp
.Stop(rOut
, *this, cUnknown
);
168 aPap
.Stop(rOut
, *this, cUnknown
);
170 aSep
.Stop(rOut
, *this, cUnknown
);
173 void Ww1Manager::OutStart( Ww1Shell
& rOut
)
175 // alle attribute, die's brauchen beginnen
177 aSep
.Start(rOut
, *this);
179 aPap
.Start(rOut
, *this);
181 aChp
.Start(rOut
, *this);
183 aFtn
.Start(rOut
, *this);
185 pFld
->Start(rOut
, *this);
187 aBooks
.Start(rOut
, *this);
188 // bestimmen, wo das naechste Ereigniss ist:
189 ULONG ulEnd
= pDoc
->Count(); // spaetestens am textende
191 if (ulEnd
> aSep
.Where()) // naechster Sep vorher?
192 ulEnd
= aSep
.Where();
194 if (ulEnd
> aPap
.Where()) // naechster Pap vorher?
195 ulEnd
= aPap
.Where();
197 if (ulEnd
> aChp
.Where()) // naechster Chp vorher?
198 ulEnd
= aChp
.Where();
200 if (ulEnd
> aFtn
.Where()) // naechster Ftn vorher?
201 ulEnd
= aFtn
.Where();
203 if (ulEnd
> pFld
->Where()) // naechster Fld vorher?
204 ulEnd
= pFld
->Where();
206 if (ulEnd
> aBooks
.Where()) // naechster Bookmark vorher?
207 ulEnd
= aBooks
.Where();
208 *pSeek
= Where(); // momentane position
209 if (*pSeek
< ulEnd
) // sind wir bereits weiter?
213 void Ww1Manager::Out(Ww1Shell
& rOut
, sal_Unicode cUnknown
)
215 // Je nach modus wird hier mit feldern, fusznoten, zeichenattributen,
216 // absatzatributen und sektionen wie folgt verfahren: von allen wird
217 // zuallererst die stop-methoden gerufen. stellt das objekt fest, dasz
218 // etwas zu beenden ist (natuerlich nicht im ersten durchgang) beendet
219 // es dies, ansonsten ist der aufruf wirkungslos. dann werden
220 // unbehandelte sonderzeichen augegeben. das werden genauso alle
221 // start-methoden gerufen und danach per where festgestellt, an
222 // welcher stelle die naechste aktion zu erwarten ist.
224 // ist der manager in einem ge'push'ten mode, werden bestimmte
225 // elemente ausgeklammert. felder werden wiederum nur in besonderen
226 // faellen augeklammert, wenn naemlich bereiche ausgegeben werden, die
227 // keine felder enthalten koennen. charakterattribute und
228 // paragraphenattribute werden jedoch nie ausgeklammert. die if (1)
229 // wurden zur verdeutlichung der einheitlichkeit eingefuegt.
231 // Erstmal eine Sonderbehandlung fuer Tabellen:
232 // die wichtigen Attribute lassen sich am Besten vor Beendigung derselben
234 // Optimierung: Sie werden nur auf sinnvolle Werte gesetzt, wenn
235 // das 0x07-Zeiche ansteht.
237 BOOL bLIsTtp
= FALSE
;
238 BOOL bLHasTtp
= FALSE
;
239 if( cUnknown
== 0x07 )
245 OutStop( rOut
, cUnknown
); // Attrs ggfs. beenden
247 // meta-zeichen interpretieren:
248 if (!Ww1PlainText::IsChar(cUnknown
))
255 if (rOut
.IsInTable() && HasInTable() && !bLIsTtp
&& !bLHasTtp
)
256 rOut
.NextTableCell();
261 case 0x0a: // linefeed
262 rOut
.NextParagraph();
264 case 0x0b: // linebreak
265 if (rOut
.IsInTable())
266 // rOut.NextBand(); // war Stuss
271 case 0x0d: // carriage return
274 case 0x0c: // pagebreak
277 case 0x14: // sectionendchar
284 OutStart( rOut
); // Attrs ggfs. starten und Naechste Pos berechnen
287 SvxFontItem
Ww1Manager::GetFont(USHORT nFCode
)
289 return aFonts
.GetFont(nFCode
);
292 void Ww1Manager::Push0(Ww1PlainText
* _pDoc
, ULONG ulSeek
, Ww1Fields
* _pFld
)
294 DBG_ASSERT(!Pushed(), "Ww1Manager");
297 *pSeek
= pDoc
->Where();
303 // ulSeek ist der FC-Abstand zwischen Hauptest-Start und Sondertext-Start
304 // ulSeek2 ist der Offset dieses bestimmten Sondertextes im Sondertext-Bereich,
305 // also z.B. der Offset des speziellen K/F-Textes
306 void Ww1Manager::Push1(Ww1PlainText
* _pDoc
, ULONG ulSeek
, ULONG ulSeek2
,
309 DBG_ASSERT(!Pushed(), "Ww1Manager");
312 *pSeek
= pDoc
->Where();
313 aPap
.Push(ulSeek
+ ulSeek2
);
314 aChp
.Push(ulSeek
+ ulSeek2
);
316 _pFld
->Seek( ulSeek2
);
320 void Ww1Manager::Pop()
322 DBG_ASSERT(Pushed(), "Ww1Manager");
333 ///////////////////////////////////////////////////////////// Bookmarks
335 void Ww1Bookmarks::Out(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT
)
339 rOut
.SetBookEnd(GetHandle());
343 const String
& rName
= GetName();
344 if( rName
.EqualsAscii( "_Toc", 0, 4 ) ) // "_Toc*" ist ueberfluessig
347 if( rOut
.IsFlagSet( SwFltControlStack::HYPO
)
348 && rName
.EqualsIgnoreCaseAscii( "FORMULAR" ) )
351 // Fuer UEbersetzung Bookmark -> Variable setzen
353 if( nLen
> MAX_FIELDLEN
)
356 // Lese Inhalt des Bookmark
357 // geht vermulich auch ueber Ww1PlainText
358 String
aVal( rMan
.GetText().GetText( Where(), nLen
) );
360 // in 2 Schritten, da OS/2 zu doof ist
361 SwFltBookmark
aBook( rName
, aVal
, GetHandle(), FALSE
);
365 void Ww1Bookmarks::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
367 if (rMan
.Where() >= Where())
374 ///////////////////////////////////////////////////////////// Footnotes
375 void Ww1Footnotes::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
377 if (rMan
.Where() >= Where())
379 DBG_ASSERT(nPlcIndex
< Count(), "WwFootnotes");
382 DBG_ASSERT(c
==0x02, "Ww1Footnotes");
385 Ww1FtnText
* pText
= new Ww1FtnText(rMan
.GetFib());
386 // beginn des textes dieser fusznote:
387 ULONG start
= aText
.Where(nPlcIndex
);
390 ULONG count
= aText
.Where(nPlcIndex
+1) - start
;
391 pText
->SetCount(count
);
392 // fusznotenkennung sollte das erste byte sein
394 DBG_ASSERT(c
==0x02, "Ww1Footnotes");
395 count
--; // fuer das eben gelesene kenn-byte
396 // fusznoten mode beginnen:
397 rOut
.BeginFootnote();
399 rMan
.Push0(pText
, pText
->Offset(rMan
.GetFib()),
400 new Ww1FootnoteFields(rMan
.GetFib()));
410 void Ww1Footnotes::Stop(Ww1Shell
& /*rOut*/, Ww1Manager
& rMan
, sal_Unicode
& c
)
412 if (bStarted
&& rMan
.Where() > Where())
414 DBG_ASSERT(nPlcIndex
< Count(), "Ww1Footnotes");
415 // DBG_ASSERT(c==0x02, "Ww1Footnotes"); // scheint Stuss zu sein
421 //////////////////////////////////////////////////////////////// Fields
422 void Ww1Fields::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
424 if (rMan
.Where() >= Where()){
425 DBG_ASSERT(nPlcIndex
< Count(), "Ww1Fields");
426 if (GetData()->chGet() == 19)
433 void Ww1Fields::Stop( Ww1Shell
& rOut
, Ww1Manager
& rMan
, sal_Unicode
& c
)
435 if (rMan
.Where() >= Where())
437 DBG_ASSERT(nPlcIndex
< Count(), "Ww1Fields");
438 if (GetData()->chGet() != 19)
441 DBG_ASSERT(c
==21, "Ww1Fields");
445 // haben wir ein fertiges feld da, das eingefuegt werden soll?
450 // das macht der filter so, damit attribute die ueber das feld
451 // gelten auch wirklich eingelesen werden und dem feld
452 // zugeordnet werden.
460 enum WWDateTime
{ WW_DONTKNOW
= 0x0, WW_DATE
= 0x1, WW_TIME
= 0x2, WW_BOTH
= 0x3 };
462 static WWDateTime
GetTimeDatePara( const String
& rForm
,
463 SwTimeFormat
* pTime
= 0,
464 SwDateFormat
* pDate
= 0 )
466 WWDateTime eDT
= WW_BOTH
;
467 if( STRING_NOTFOUND
== rForm
.Search( 'H' )) // H -> 24h
472 else if( STRING_NOTFOUND
== rForm
.Search( 'H' )) // h -> 24h
479 eDT
= (WWDateTime
)( eDT
& ~(USHORT
)WW_TIME
);
482 xub_StrLen nDPos
= 0;
483 while( STRING_NOTFOUND
!= nDPos
)
485 nDPos
= rForm
.Search( 'M', nDPos
); // M -> Datum
488 sal_Unicode cPrev
= rForm
.GetChar( nDPos
- 1 );
489 // ignoriere dabei "AM", "aM", "PM", "pM"
490 if( 'a' != cPrev
&& 'A' != cPrev
&& 'p' != cPrev
&& 'P' != cPrev
)
496 if( STRING_NOTFOUND
!= nDPos
) // Monat -> Datum ?
498 static SwDateFormat __READONLY_DATA aDateA
[32] =
500 DFF_DMY
, DFF_DMMY
, DFF_DMYY
, DFF_DMMYY
,
501 DFF_DMMMY
, DFF_DMMMY
, DFF_DMMMYY
, DFF_DMMMYY
,
502 DFF_DDMMY
, DFF_DDMMY
, DFF_DDMMMYY
, DFF_DDMMMYY
,
503 DFF_DDMMMY
, DFF_DDMMMY
, DFF_DDMMMYY
, DFF_DDMMMYY
,
504 DFF_DDDMMMY
, DFF_DDDMMMY
, DFF_DDDMMMYY
, DFF_DDDMMMYY
,
505 DFF_DDDMMMY
, DFF_DDDMMMY
, DFF_DDDMMMYY
, DFF_DDDMMMYY
,
506 DFF_DDDMMMY
, DFF_DDDMMMY
, DFF_DDDMMMYY
, DFF_DDDMMMYY
,
507 DFF_DDDMMMY
, DFF_DDDMMMY
, DFF_DDDMMMYY
, DFF_DDDMMMYY
510 BOOL bHasDay
= STRING_NOTFOUND
!= rForm
.Search( 't' ) ||
511 STRING_NOTFOUND
!= rForm
.Search( 'T' ) ||
512 STRING_NOTFOUND
!= rForm
.Search( 'd' ) ||
513 STRING_NOTFOUND
!= rForm
.Search( 'D' );
515 BOOL bLongDayOfWeek
= STRING_NOTFOUND
!= rForm
.SearchAscii( "tttt" ) ||
516 STRING_NOTFOUND
!= rForm
.SearchAscii( "TTTT" ) ||
517 STRING_NOTFOUND
!= rForm
.SearchAscii( "dddd" ) ||
518 STRING_NOTFOUND
!= rForm
.SearchAscii( "DDDD" );
520 BOOL bDayOfWeek
= STRING_NOTFOUND
!= rForm
.SearchAscii( "ttt" ) ||
521 STRING_NOTFOUND
!= rForm
.SearchAscii( "TTT" ) ||
522 STRING_NOTFOUND
!= rForm
.SearchAscii( "ddd" ) ||
523 STRING_NOTFOUND
!= rForm
.SearchAscii( "DDD" );
525 // M, MM -> numeric month
526 // MMM, MMMM -> text. month
527 BOOL bLitMonth
= STRING_NOTFOUND
!= rForm
.SearchAscii( "MMM" );
528 // MMMM -> full month
529 BOOL bFullMonth
= STRING_NOTFOUND
!= rForm
.SearchAscii( "MMMM" );
530 // jj, JJ -> 2-col-year
531 // jjjj, JJJJ -> 4-col-year
532 BOOL bFullYear
= STRING_NOTFOUND
!= rForm
.SearchAscii( "jjj" ) ||
533 STRING_NOTFOUND
!= rForm
.SearchAscii( "JJJ" ) ||
534 STRING_NOTFOUND
!= rForm
.SearchAscii( "yyy" ) ||
535 STRING_NOTFOUND
!= rForm
.SearchAscii( "YYY" );
537 USHORT i
= ( bLitMonth
& 1 )
538 | ( ( bFullYear
& 1 ) << 1 )
539 | ( ( bFullMonth
& 1 ) << 2 )
540 | ( ( bDayOfWeek
& 1 ) << 3 )
541 | ( ( bLongDayOfWeek
& 1 ) << 4 );
544 if( !bHasDay
&& !bFullMonth
)
552 eDT
= (WWDateTime
)( eDT
& ~(USHORT
)WW_DATE
);
558 extern void sw3io_ConvertFromOldField( SwDoc
& rDoc
, USHORT
& rWhich
,
559 USHORT
& rSubType
, ULONG
&rFmt
,
562 void Ww1Fields::Out(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT nDepth
)
564 String sType
; // der typ als string
565 String sFormel
; // die formel
567 String sDTFormat
; // Datum / Zeit-Format
568 W1_FLD
* pData
= GetData(); // die an den plc gebunden daten
569 DBG_ASSERT(pData
->chGet()==19, "Ww1Fields"); // sollte beginn sein
573 DBG_ASSERT(c
==19, "Ww1Fields"); // sollte auch beginn sein
574 if (pData
->chGet()==19 && c
== 19)
577 c
= rMan
.Fill( aStr
, GetLength() );
578 DBG_ASSERT(Ww1PlainText::IsChar(c
), "Ww1Fields");
579 xub_StrLen pos
= aStr
.Search(' ');
580 // get type out of text
581 sType
= aStr
.Copy( 0, pos
);
582 aStr
.Erase( 0, pos
);
583 if ( pos
!= STRING_NOTFOUND
)
586 BYTE rbType
= pData
->fltGet();
588 // solange den formelteil einlesen, bis das feld entweder
589 // zuende ist oder der ergebnisteil beginnt. dabei koennen
590 // natuerlich neue felder beginnen (word unterstuetzt felder,
591 // die wiederum felder beinhalten).
594 if (pData
->chGet()==19) // nested field
596 Out(rOut
, rMan
, nDepth
+1);
598 DBG_ASSERT(c
==21, "Ww1PlainText");
599 sFormel
.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "Ww" ));
600 sFormel
+= String::CreateFromInt32( nPlcIndex
);
601 c
= rMan
.Fill(aStr
, GetLength());
602 DBG_ASSERT(Ww1PlainText::IsChar(c
), "Ww1PlainText");
606 while (pData
->chGet()==19);
608 // get format out of text
609 pos
= sFormel
.SearchAscii( "\\*" );
610 sFormat
= sFormel
.Copy( pos
);
611 sFormel
.Erase( pos
);
613 pos
= sFormel
.SearchAscii( "\\@" );
614 sDTFormat
= sFormel
.Copy( pos
);
615 sFormel
.Erase( pos
);
617 // der formelteil ist zuende, kommt ein ergebnisteil?
618 if( pData
->chGet() == 20 )
621 DBG_ASSERT(c
==20, "Ww1PlainText");
622 c
= rMan
.Fill(sErgebnis
, GetLength());
623 if (!Ww1PlainText::IsChar(c
))
624 sErgebnis
+= c
; //~ mdt: sonderzeichenbenhandlung
628 DBG_ASSERT(pData
->chGet()==21, "Ww1PlainText");
630 DBG_ASSERT(pField
==0, "Ww1PlainText");
637 // naja, aber info enthaelt alle moeglichkeiten, die auch direkt da sind
641 case 3: // bookmark reference
642 rOut
.ConvertUStr( sFormel
);
643 pField
= new SwGetRefField( (SwGetRefFieldType
*)
644 rOut
.GetSysFldType( RES_GETREFFLD
),
649 // pField = new SwGetExpField((SwGetExpFieldType*)
650 // rOut.GetSysFldType(RES_GETEXPFLD), sFormel, nsSwGetSetExpType::GSE_STRING);
652 // nsSwGetSetExpType::GSE_STRING, VVF_SYS);
654 case 6: // set command
656 pos
= aStr
.Search(' ');
657 String
aName( aStr
.Copy( 0, pos
));
662 rOut
.ConvertUStr( aName
);
663 SwFieldType
* pFT
= rOut
.GetDoc().InsertFldType(
664 SwSetExpFieldType( &rOut
.GetDoc(), aName
, nsSwGetSetExpType::GSE_STRING
) );
665 pField
= new SwSetExpField((SwSetExpFieldType
*)pFT
, aStr
);
666 ((SwSetExpField
*)pField
)->SetSubType( nsSwExtendedSubType::SUB_INVISIBLE
);
667 // Invisible macht in 378 AErger, soll aber demnaechst gehen
669 // das Ignorieren des Bookmarks ist nicht implementiert
674 pos
= aStr
.Search(' ');
675 String
aSubType( aStr
.Copy( 0, pos
));
678 rOut
.ConvertUStr( aSubType
);
681 // ganz grosze schiete: der typ 'info' kann einem der
682 // typen 15..31 entsprechen. er enthaelt als formel
683 // das eingentliche feld der doc-info.
684 // kein ';' benutzen mit folgendem macro:
685 #define IS(sd, se, t) \
686 if (aSubType.EqualsAscii( sd ) || aSubType.EqualsAscii( se)) \
690 // deutsche bez. englische bez. typ-code
691 IS("titel", "title", 15)
692 IS("thema", "subject", 16)
693 IS("autor", "author", 17)
694 IS("stichw?rter", "keywords", 18) //~ mdt: umlaut
695 IS("kommentar", "comment", 19)
696 IS("gespeichertvon", "lastrevisedby", 20)
697 IS("ertelldat", "creationdate", 21)
698 IS("speicherdat", "revisiondate", 22)
699 IS("druckdat", "printdate", 23)
700 IS("version", "revisionnumber", 24)
701 IS("zeit", "edittime", 25)
702 IS("anzseit", "numberofpages", 26)
703 IS("anzw?rter", "numberofwords", 27) //~ mdt: umlaut
704 IS("anzzeichen", "numberofchars", 28)
705 IS("dateiname", "filename", 29)
706 IS("vorlage", "templatename", 30)
714 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
715 rOut
.GetSysFldType(RES_DOCINFOFLD
), DI_TITEL
, String(), 0);
718 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
719 rOut
.GetSysFldType(RES_DOCINFOFLD
), DI_THEMA
, String(), 0);
722 pField
= new SwAuthorField((SwAuthorFieldType
*)
723 rOut
.GetSysFldType(RES_AUTHORFLD
), AF_NAME
);
726 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
727 rOut
.GetSysFldType(RES_DOCINFOFLD
), DI_KEYS
, String(), 0);
730 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
731 rOut
.GetSysFldType(RES_DOCINFOFLD
), DI_COMMENT
, String(), 0);
733 case 20: // last revised by
734 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
735 rOut
.GetSysFldType(RES_DOCINFOFLD
), DI_CHANGE
|DI_SUB_AUTHOR
, String());
737 case 21: // creation date
738 case 22: // revision date
739 case 23: // print date
740 case 25:{// edit time
742 USHORT nReg
= 0; // RegInfoFormat, DefaultFormat fuer DocInfoFelder
747 case 21: nSub
= DI_CREATE
; nReg
= DI_SUB_DATE
; break;
748 case 23: nSub
= DI_PRINT
; nReg
= DI_SUB_DATE
; break;
749 case 22: nSub
= DI_CHANGE
; nReg
= DI_SUB_DATE
; break;
750 case 25: nSub
= DI_CHANGE
; nReg
= DI_SUB_TIME
; break;
752 switch( GetTimeDatePara( sDTFormat
) )
754 case WW_DATE
: nReg
= DI_SUB_DATE
; break;
755 case WW_TIME
: nReg
= DI_SUB_TIME
; break;
756 case WW_BOTH
: nReg
= DI_SUB_DATE
; break;
759 // WW_DONTKNOW -> Default bereits gesetzt
761 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
762 rOut
.GetSysFldType(RES_DOCINFOFLD
), nSub
| nReg
, String());
765 case 24: // revision number
766 pField
= new SwDocInfoField((SwDocInfoFieldType
*)
767 rOut
.GetSysFldType(RES_DOCINFOFLD
), DI_DOCNO
, String(), 0);
769 case 26: // number of pages
770 pField
= new SwDocStatField((SwDocStatFieldType
*)
771 rOut
.GetSysFldType(RES_DOCSTATFLD
), DS_PAGE
, SVX_NUM_ARABIC
);
773 case 27: // number of words
774 pField
= new SwDocStatField((SwDocStatFieldType
*)
775 rOut
.GetSysFldType(RES_DOCSTATFLD
), DS_WORD
, SVX_NUM_ARABIC
);
777 case 28: // number of chars
778 pField
= new SwDocStatField((SwDocStatFieldType
*)
779 rOut
.GetSysFldType(RES_DOCSTATFLD
), DS_CHAR
, SVX_NUM_ARABIC
);
781 case 29: // file name
782 pField
= new SwFileNameField((SwFileNameFieldType
*)
783 rOut
.GetSysFldType(RES_FILENAMEFLD
));
785 case 30: // doc template name
786 pField
= new SwTemplNameField((SwTemplNameFieldType
*)
787 rOut
.GetSysFldType(RES_TEMPLNAMEFLD
), FF_NAME
);
791 SwDateFormat aDate
= DF_SSYS
;
792 SwTimeFormat aTime
= TF_SYSTEM
;
794 WWDateTime eDT
= GetTimeDatePara(sDTFormat
, &aTime
, &aDate
);
795 if( eDT
== WW_DONTKNOW
) // kein D/T-Formatstring
796 eDT
= ( rbType
== 32 ) ? WW_TIME
: WW_DATE
; // benutze ID
800 USHORT nWhich
= RES_DATEFLD
;
801 USHORT nSubType
= DATEFLD
;
802 ULONG nFormat
= aDate
;
803 sw3io_ConvertFromOldField( rOut
.GetDoc(),
804 nWhich
, nSubType
, nFormat
, 0x0110 );
805 pField
= new SwDateTimeField((SwDateTimeFieldType
*)
806 rOut
.GetSysFldType(RES_DATETIMEFLD
), DATEFLD
, nFormat
);
809 rOut
<< * pField
<< ' ';
810 // Mogel: direkt einfuegen und Space dahinter
814 USHORT nWhich
= RES_TIMEFLD
;
815 USHORT nSubType
= TIMEFLD
;
816 ULONG nFormat
= aTime
;
817 sw3io_ConvertFromOldField( rOut
.GetDoc(),
818 nWhich
, nSubType
, nFormat
, 0x0110 );
819 pField
= new SwDateTimeField((SwDateTimeFieldType
*)
820 rOut
.GetSysFldType(RES_DATETIMEFLD
), TIMEFLD
, nFormat
);
825 case 33: // current page
826 pField
= new SwPageNumberField((SwPageNumberFieldType
*)
827 rOut
.GetSysFldType(RES_PAGENUMBERFLD
), PG_RANDOM
, SVX_NUM_ARABIC
);
829 case 34: // evaluation exp
833 SwGetExpFieldType
* pFieldType
=
834 (SwGetExpFieldType
*)rOut
.GetSysFldType(RES_GETEXPFLD
);
835 DBG_ASSERT(pFieldType
!=0, "Ww1Fields");
837 pField
= new SwGetExpField(pFieldType
, sFormel
,
838 nsSwGetSetExpType::GSE_STRING
, VVF_SYS
);
842 String
aName( String::CreateFromAscii(
843 RTL_CONSTASCII_STRINGPARAM( "Ww" )));
844 aName
+= String::CreateFromInt32( nPlcIndex
);
845 SwFieldType
* pFT
= rOut
.GetDoc().GetFldType( RES_SETEXPFLD
, aName
, false);
848 SwSetExpFieldType
aS(&rOut
.GetDoc(), aName
, nsSwGetSetExpType::GSE_FORMULA
);
849 pFT
= rOut
.GetDoc().InsertFldType(aS
);
851 SwSetExpField
aFld((SwSetExpFieldType
*)pFT
, sFormel
);
852 aFld
.SetSubType(nsSwExtendedSubType::SUB_INVISIBLE
);
857 case 36: // print command, Einfuegendatei
859 pos
= aStr
.Search(' ');
860 String
aFName( aStr
.Copy( 0, pos
));
865 aFName
.SearchAndReplaceAscii( "\\\\", String( '\\' ));
867 // char* pBook = FindNextPara( pNext, 0 ); //!! Bookmark/Feld-Name
868 // //!! erstmal nicht
870 // ConvertFFileName( aPara, pFName ); //!! WW1 ????
871 aFName
= URIHelper::SmartRel2Abs(
872 INetURLObject(rOut
.GetBaseURL()), aFName
);
874 String
aName( String::CreateFromAscii(
875 RTL_CONSTASCII_STRINGPARAM( "WW" )));
876 SwSection
* pSection
= new SwSection( FILE_LINK_SECTION
,
877 rOut
.GetDoc().GetUniqueSectionName( &aStr
) );
878 pSection
->SetLinkFileName( aFName
);
879 pSection
->SetProtect( TRUE
);
880 rOut
<< SwFltSection( pSection
);
881 rOut
.EndItem( RES_FLTR_SECTION
);
882 rOut
.NextParagraph();
885 pField
= new SwGetRefField(
886 (SwGetRefFieldType
*)rOut
.GetSysFldType(RES_GETREFFLD
),
887 sFormel
, 0, 0, REF_PAGE
);
889 case 38: // ask command
891 pos
= aStr
.Search(' ');
892 String
aName( aStr
.Copy( 0, pos
));
898 SwFieldType
* pFT
= rOut
.GetDoc().InsertFldType(
899 SwSetExpFieldType( &rOut
.GetDoc(), aName
, nsSwGetSetExpType::GSE_STRING
) );
900 pField
= new SwSetExpField((SwSetExpFieldType
*)pFT
, aStr
);
901 ((SwSetExpField
*)pField
)->SetInputFlag( TRUE
);
902 ((SwSetExpField
*)pField
)->SetSubType(nsSwExtendedSubType::SUB_INVISIBLE
);
903 // pField.SetPromptText( aQ ); //!! fehlt noch
904 // aFld.SetPar2( aDef ); //!! dito
905 // das Ignorieren des Bookmarks ist nicht implementiert
907 case 39: // fillin command
908 pField
= new SwInputField(
909 (SwInputFieldType
*)rOut
.GetSysFldType( RES_INPUTFLD
),
911 INP_TXT
, 0 ); // sichtbar ( geht z.Zt. nicht anders )
913 case 51: // macro button
915 pos
= aStr
.Search(' ');
916 String
aName( aStr
.Copy( 0, pos
));
919 if( !aName
.Len() || !aStr
.Len() )
921 aName
.InsertAscii( "StarOffice.Standard.Modul1.", 0 );
923 pField
= new SwMacroField( (SwMacroFieldType
*)
924 rOut
.GetSysFldType( RES_MACROFLD
),
928 case 55: // read tiff / or better: import anything
930 const sal_Unicode
* pFormel
= sFormel
.GetBuffer();
931 const sal_Unicode
* pDot
= 0;
933 while (*pFormel
!= '\0' && *pFormel
!= ' ')
935 // ab hier koennte eine extension kommen
939 // aha: wir waren bislang noch in dirs
940 if (*pFormel
== '\\')
943 if (pFormel
[1] == '\\')
946 if (*pFormel
!= '\0')
952 while( *pDot
!= '\0' && *pDot
!= ' ')
955 if( sExt
.EqualsIgnoreCaseAscii( ".tiff" )
956 || sExt
.EqualsIgnoreCaseAscii( ".bmp" )
957 || sExt
.EqualsIgnoreCaseAscii( ".gif" )
958 || sExt
.EqualsIgnoreCaseAscii( ".pcx" )
959 || sExt
.EqualsIgnoreCaseAscii( ".pic" ))
960 rOut
.AddGraphic( sName
);
969 DBG_ASSERT(FALSE
, "Ww1PlainText");
972 case 2: // possible bookmark
973 case 4: // index entry
975 case 5: // footnote ref
976 // pField = new SwGetRefField(
977 // (SwGetRefFieldType*)rDoc.GetSysFldType(RES_GETREFFLD),
978 // sFormel, REF_FOOTNOTE, 0, REF_BEGIN);
979 case 7: // if command
980 case 8: // create index
982 case 9: // table of contents entry
984 case 10: // style ref
987 case 13: // create table of contents
989 case 35: // literal text
991 case 40: // data command
992 case 41: // next command
993 case 42: // nextif command
994 case 43: // skipif command
995 case 44: // number of record
998 case 46: // dde auto ref
999 case 47: // glossary entry
1000 case 48: // print char
1001 case 49: // formula def
1002 case 50: // goto button
1003 case 52: // auto number outline
1004 case 53: // auto number legal
1005 case 54: // auto number arabic
1009 if( bKnown
|| sErgebnis
.EqualsAscii( "\270" ))
1010 this->sErgebnis
.Erase();
1012 this->sErgebnis
= sErgebnis
;
1014 else // oops: we are terribly wrong: skip this
1018 ULONG
Ww1Fields::GetLength()
1020 // berechnet die laenge eines feldteiles. nicht mitgerechnet werden
1021 // die terminierenden zeichen im text (19, 20, 21) die beginn, trenner
1022 // und ende bedeuten.
1023 ULONG ulBeg
= Where();
1024 ULONG ulEnd
= Where(nPlcIndex
+1);
1025 DBG_ASSERT(ulBeg
<ulEnd
, "Ww1Fields");
1026 return (ulEnd
- ulBeg
) - 1;
1029 /////////////////////////////////////////////////////////////////// Sep
1030 void Ww1Sep::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1032 if (rMan
.Where() >= Where())
1035 SwFrmFmt
&rFmt
= rOut
.GetPageDesc().GetMaster();
1036 W1_DOP
& rDOP
= rMan
.GetDop().GetDOP();
1037 rOut
.GetPageDesc().SetLandscape(rDOP
.fWideGet());
1038 SwFmtFrmSize
aSz(rFmt
.GetFrmSize());
1039 aSz
.SetWidth(rDOP
.xaPageGet());
1040 aSz
.SetHeight(rDOP
.yaPageGet());
1041 rFmt
.SetFmtAttr(aSz
);
1042 SvxLRSpaceItem
aLR(rDOP
.dxaLeftGet()+rDOP
.dxaGutterGet(),
1043 rDOP
.dxaRightGet(), 0, 0, RES_LR_SPACE
);
1044 rFmt
.SetFmtAttr(aLR
);
1045 SvxULSpaceItem
aUL(rDOP
.dyaTopGet(), rDOP
.dyaBottomGet(), RES_UL_SPACE
);
1046 rFmt
.SetFmtAttr(aUL
);
1047 // sobald wir mit dem lesen der zeichen soweit sind, wo sep's
1048 // momentanes attribut beginnt, wird dieses attribut eingefuegt.
1049 // diese methode ist bei den meisten start/stop methoden der
1050 // memberklassen des managers identisch.
1051 BYTE
* pByte
= GetData();
1052 Ww1SprmSep
aSprm(rFib
, SVBT32ToUInt32(pByte
+ 2));
1053 aSprm
.Start(rOut
, rMan
);
1054 aSprm
.Stop(rOut
, rMan
);
1056 aHdd
.Start(rOut
, rMan
);
1060 /////////////////////////////////////////////////////////////////// Pap
1061 void Ww1Pap::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1063 if (rMan
.Where() >= Where())
1067 // bereitstellen der zu startenden attribute
1068 if (FillStart(pByte
, cb
))
1070 Ww1SprmPapx
aSprm(pByte
, cb
);
1072 aSprm
.Start(rOut
, rMan
);
1078 void Ww1Pap::Stop(Ww1Shell
& rOut
, Ww1Manager
& rMan
, sal_Unicode
&)
1080 if (rMan
.Where() >= Where() || rMan
.IsStopAll())
1084 if (FillStop(pByte
, cb
)){
1085 Ww1SprmPapx
aSprm(pByte
, cb
);
1086 aSprm
.Stop(rOut
, rMan
);
1088 DBG_ASSERT( !nPlcIndex
|| rMan
.IsStopAll(), "Pap-Attribut-Stop verloren" );
1089 // rMan.IsStopAll() ist nicht schoen.
1094 //////////////////////////////////////////////////////////////// W1_CHP
1096 // momentan laesst sich die ausgabe von W1CHPxen nicht nur per define
1099 void W1_CHP::Out(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1102 rOut
<< SvxWeightItem(
1103 rOut
.GetWeightBold()?WEIGHT_NORMAL
:WEIGHT_BOLD
, RES_CHRATR_WEIGHT
);
1105 rOut
<< SvxPostureItem(
1106 rOut
.GetPostureItalic()?ITALIC_NONE
:ITALIC_NORMAL
, RES_CHRATR_POSTURE
);
1108 rOut
<< SvxCrossedOutItem(
1109 rOut
.GetCrossedOut()?STRIKEOUT_NONE
:STRIKEOUT_SINGLE
, RES_CHRATR_CROSSEDOUT
);
1111 rOut
<< SvxContourItem(!rOut
.GetContour(), RES_CHRATR_CONTOUR
);
1112 if (fSmallCapsGet())
1113 rOut
<< SvxCaseMapItem(
1114 rOut
.GetCaseKapitaelchen()?SVX_CASEMAP_NOT_MAPPED
:SVX_CASEMAP_KAPITAELCHEN
, RES_CHRATR_CASEMAP
);
1116 rOut
<< SvxCaseMapItem(
1117 rOut
.GetCaseVersalien()?SVX_CASEMAP_NOT_MAPPED
:SVX_CASEMAP_VERSALIEN
, RES_CHRATR_CASEMAP
);
1119 rOut
<< SvxFontHeightItem(hpsGet() * 10, 100, RES_CHRATR_FONTSIZE
);
1123 rOut
<< SvxUnderlineItem(UNDERLINE_NONE
, RES_CHRATR_UNDERLINE
) <<
1124 SvxWordLineModeItem(FALSE
, RES_CHRATR_WORDLINEMODE
);
1126 default: DBG_ASSERT(FALSE
, "Chpx");
1128 rOut
<< SvxUnderlineItem(UNDERLINE_SINGLE
, RES_CHRATR_UNDERLINE
);
1131 rOut
<< SvxUnderlineItem(UNDERLINE_SINGLE
, RES_CHRATR_UNDERLINE
) <<
1132 SvxWordLineModeItem(TRUE
, RES_CHRATR_WORDLINEMODE
);
1135 rOut
<< SvxUnderlineItem(UNDERLINE_DOUBLE
, RES_CHRATR_UNDERLINE
);
1138 rOut
<< SvxUnderlineItem(UNDERLINE_DOTTED
, RES_CHRATR_UNDERLINE
);
1144 default: DBG_ASSERT(FALSE
, "Chpx");
1145 case 0: { rOut
.EndItem(RES_CHRATR_COLOR
); } break;
1146 case 1: { rOut
<< SvxColorItem(Color(COL_BLACK
), RES_CHRATR_COLOR
); } break;
1147 case 2: { rOut
<< SvxColorItem(Color(COL_LIGHTBLUE
), RES_CHRATR_COLOR
); } break;
1148 case 3: { rOut
<< SvxColorItem(Color(COL_LIGHTCYAN
), RES_CHRATR_COLOR
); } break;
1149 case 4: { rOut
<< SvxColorItem(Color(COL_LIGHTGREEN
), RES_CHRATR_COLOR
); } break;
1150 case 5: { rOut
<< SvxColorItem(Color(COL_LIGHTMAGENTA
), RES_CHRATR_COLOR
); } break;
1151 case 6: { rOut
<< SvxColorItem(Color(COL_LIGHTRED
), RES_CHRATR_COLOR
); } break;
1152 case 7: { rOut
<< SvxColorItem(Color(COL_YELLOW
), RES_CHRATR_COLOR
); } break;
1153 case 8: { rOut
<< SvxColorItem(Color(COL_WHITE
), RES_CHRATR_COLOR
); } break;
1156 short sQps
= qpsSpaceGet();
1159 rOut
<< SvxKerningItem(sQps
, RES_CHRATR_KERNING
);
1162 if (hpsPosGet() == 0)
1163 rOut
<< SvxEscapementItem(SVX_ESCAPEMENT_OFF
, 100, RES_CHRATR_ESCAPEMENT
);
1165 short sHps
= hpsPosGet();
1170 rOut
<< SvxEscapementItem(sHps
, 100, RES_CHRATR_ESCAPEMENT
);
1174 SvxFontItem
aFont(rMan
.GetFont(ftcGet()));
1179 /////////////////////////////////////////////////////////////////// Chp
1180 void Ww1Chp::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1182 if (rMan
.Where() >= Where())
1185 if (FillStart(aChpx
))
1187 aChpx
.Out(rOut
, rMan
);
1188 if (aChpx
.fcPicGet())
1190 Ww1Picture
aPic(rMan
.GetFib().GetStream(),
1192 if (!aPic
.GetError())
1193 aPic
.Out(rOut
, rMan
);
1200 void Ww1Chp::Stop(Ww1Shell
& rOut
, Ww1Manager
& rMan
, sal_Unicode
&)
1202 if (rMan
.Where() >= Where())
1205 if (FillStop(aChpx
))
1207 // zuerst alle toggle-flags
1208 if (aChpx
.fBoldGet())
1209 rOut
.EndItem(RES_CHRATR_WEIGHT
);
1210 if (aChpx
.fItalicGet())
1211 rOut
.EndItem(RES_CHRATR_POSTURE
);
1212 if (aChpx
.fStrikeGet())
1213 rOut
.EndItem(RES_CHRATR_CROSSEDOUT
);
1214 if (aChpx
.fOutlineGet())
1215 rOut
.EndItem(RES_CHRATR_CONTOUR
);
1216 if (aChpx
.fSmallCapsGet() || aChpx
.fCapsGet())
1217 rOut
.EndItem(RES_CHRATR_CASEMAP
);
1218 // dann alle zahl-werte, diese haben flags, wenn sie gesetzt
1219 // sind..................
1220 if (aChpx
.fsHpsGet())
1221 rOut
.EndItem(RES_CHRATR_FONTSIZE
);
1222 if (aChpx
.fsKulGet())
1223 rOut
.EndItem(RES_CHRATR_UNDERLINE
)
1224 .EndItem(RES_CHRATR_WORDLINEMODE
);
1225 if (aChpx
.fsIcoGet())
1226 rOut
.EndItem(RES_CHRATR_COLOR
);
1227 if (aChpx
.fsSpaceGet())
1228 rOut
.EndItem(RES_CHRATR_KERNING
);
1229 if (aChpx
.fsPosGet())
1230 rOut
.EndItem(RES_CHRATR_ESCAPEMENT
);
1231 if (aChpx
.fsFtcGet())
1232 rOut
.EndItem(RES_CHRATR_FONT
);
1234 DBG_ASSERT( !nPlcIndex
, "Chp-Attribut-Stop verloren" );
1239 ///////////////////////////////////////////////////////////////// Style
1240 void Ww1Style::Out(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1242 // Zuerst Basis, damit Attribute des Basis-Styles erkannt werden
1243 // first: Base................................................
1244 if(pParent
->GetStyle(stcBase
).IsUsed() ) // Basis gueltig ?
1245 rOut
.BaseStyle(stcBase
);
1247 // next of all: CHP...............................................
1248 aChpx
.Out(rOut
, rMan
);
1249 // Last: PAP.......................................................
1251 pPapx
->Start(rOut
, rMan
);
1254 ////////////////////////////////////////////////////////// Ww1PlainText
1256 // die Out() methoden von plaintext fuer den filter geben eine anzahl
1257 // zeichen aus auf die shell, einen string oder einen char, wieviel
1258 // zeichen ausgegeben werden, bestimmt ulEnd, das das ende bestimmt,
1259 // bis zudem ausgegeben wird. ausserdem beenden die methoden die
1260 // ausgabe bei kontrollzeichen.
1261 // diese sind definiert durch MinChar. alle zeichen mit wert darunter
1262 // gelten als kontroll- zeichen. dafuer gibts die methode IsChar, die
1263 // zurueckgibt, ob es sich um ein standard zeichen handelt. kommt ein
1264 // solches zeichen, wird dieses zeichen zurueckgegeben und die methode
1265 // beendet, auch wenn ulEnd noch nicht erreicht wurde. bei nutzung
1266 // also beachten, dasz wenn !IsChar(Out(...)) gilt, ulEnd unter
1267 // umstaenden nicht erreicht wurde. dann wurde das kontrollzeichen
1268 // zwar (weg-)gelesen, jedoch noch nicht ausgegeben.
1270 sal_Unicode
Ww1PlainText::Out( Ww1Shell
& rOut
, ULONG
& ulEnd
)
1272 // gibt die zeichen bis ulEnd aus, es sei den es kommen sonderzeichen
1273 // die eine bedeutung haben wie absatzende oder seitenumbruch.
1274 if (ulEnd
> Count())
1276 while (ulSeek
< ulEnd
)
1278 sal_Unicode c
= (*this)[ulSeek
];
1280 if (Ww1PlainText::IsChar(c
))
1285 return Ww1PlainText::MinChar
;
1288 sal_Unicode
Ww1PlainText::Out( String
& rStr
, ULONG ulEnd
)
1290 // wie Out(Shell..., jedoch ausgabe auf einen string
1292 if (ulEnd
> Count())
1294 while (ulSeek
< ulEnd
)
1296 sal_Unicode c
= (*this)[ulSeek
];
1298 if( Ww1PlainText::IsChar(c
) )
1303 return Ww1PlainText::MinChar
;
1307 // hier eruebrigt sich ulEnd...oder?
1309 sal_Unicode
Ww1PlainText::Out( sal_Unicode
& rRead
)
1311 rRead
= (*this)[ulSeek
];
1316 /////////////////////////////////////////////////////////// Ww1SprmPapx
1318 void Ww1SprmPapx::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1320 if( !rMan
.IsInStyle() ){ // Innerhalb Style gehts ueber die
1321 // normalen Attribute
1323 && !rOut
.IsInTable() // Nicht innerhalb Tabelle!
1324 && ( rMan
.HasPPc() || rMan
.HasPDxaAbs())){ // Fly-Start
1325 rOut
.BeginFly(); // eAnchor );
1327 if (!rOut
.IsInTable() && rMan
.HasInTable())
1331 rOut
.SetStyle(aPapx
.stcGet());
1333 Ww1Sprm::Start(rOut
, rMan
);
1336 void Ww1SprmPapx::Stop(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1338 Ww1Sprm::Stop(rOut
, rMan
);
1340 if( !rMan
.IsInStyle() ) // Innerhalb Style gehts ueber die
1341 { // normalen Attribute
1342 if (rOut
.IsInTable() &&( rMan
.IsStopAll() || !rMan
.HasInTable()))
1345 if( rOut
.IsInFly() &&
1347 || ( !rMan
.HasPPc() && !rMan
.HasPDxaAbs() // Fly-Ende
1348 && !rOut
.IsInTable()))) // Nicht innerhalb Tabelle!
1353 ///////////////////////////////////////////////////////////////// Fonts
1354 SvxFontItem
Ww1Fonts::GetFont(USHORT nFCode
)
1356 // erzeugen eine fonts im sw-sinne aus den word-strukturen
1357 FontFamily eFamily
= FAMILY_DONTKNOW
;
1359 FontPitch ePitch
= PITCH_DONTKNOW
;
1360 rtl_TextEncoding eCharSet
= RTL_TEXTENCODING_DONTKNOW
;
1363 // In the Winword 1.x format, the names of the first three fonts were
1364 // omitted from the table and assumed to be "Tms Rmn" (for ftc = 0),
1365 // "Symbol", and "Helv"
1367 eFamily
= FAMILY_ROMAN
;
1368 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Tms Rmn" ));
1369 ePitch
= PITCH_VARIABLE
;
1370 eCharSet
= RTL_TEXTENCODING_MS_1252
;
1373 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Symbol" ));
1374 ePitch
= PITCH_VARIABLE
;
1375 eCharSet
= RTL_TEXTENCODING_SYMBOL
;
1378 eFamily
= FAMILY_SWISS
;
1379 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helv" ));
1380 ePitch
= PITCH_VARIABLE
;
1381 eCharSet
= RTL_TEXTENCODING_MS_1252
;
1385 W1_FFN
* pF
= GetFFN(nFCode
- 3);
1388 // Fontname .........................................
1389 aName
= String( (sal_Char
*)pF
->szFfnGet(),
1390 RTL_TEXTENCODING_MS_1252
);
1391 // Pitch .............................................
1392 static FontPitch ePitchA
[] =
1394 PITCH_DONTKNOW
, PITCH_FIXED
, PITCH_VARIABLE
, PITCH_DONTKNOW
1396 ePitch
= ePitchA
[pF
->prgGet()];
1397 // CharSet ...........................................
1398 eCharSet
= RTL_TEXTENCODING_MS_1252
;
1399 if (aName
.EqualsIgnoreCaseAscii("Symbol")
1400 || aName
.EqualsIgnoreCaseAscii("Symbol Set")
1401 || aName
.EqualsIgnoreCaseAscii("Wingdings")
1402 || aName
.EqualsIgnoreCaseAscii("ITC Zapf Dingbats") )
1403 eCharSet
= RTL_TEXTENCODING_SYMBOL
;
1404 // FontFamily ........................................
1405 USHORT b
= pF
->ffGet();
1406 static FontFamily eFamilyA
[] =
1408 FAMILY_DONTKNOW
, FAMILY_ROMAN
, FAMILY_SWISS
, FAMILY_MODERN
,
1409 FAMILY_SCRIPT
, FAMILY_DECORATIVE
1411 if (b
< sizeof(eFamilyA
))
1412 eFamily
= eFamilyA
[b
];
1416 DBG_ASSERT(FALSE
, "WW1Fonts::GetFont: Nicht existenter Font !");
1417 eFamily
= FAMILY_SWISS
;
1418 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helv" ));
1419 ePitch
= PITCH_VARIABLE
;
1420 eCharSet
= RTL_TEXTENCODING_MS_1252
;
1426 if ( SwFltGetFlag( nFieldFlags
, SwFltControlStack::HYPO
)
1427 && ( aName
.EqualsIgnoreCaseAscii("Helv")
1428 || aName
.EqualsIgnoreCaseAscii("Helvetica") ) )
1430 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica Neue" ));
1431 if (eFamily
==FAMILY_DONTKNOW
)
1432 eFamily
= FAMILY_SWISS
;
1436 // VCL matcht die Fonts selber
1437 // allerdings passiert bei Helv, Tms Rmn und System Monospaced
1438 // Scheisse, so dass diese ersetzt werden muessen.
1439 // Nach TH sollen diese durch feste Werte ersetzt werden,
1440 // also nicht ueber System::GetStandardFont, damit keine
1441 // Namenslisten auftauchen ( Dieses koennte den User verwirren )
1442 if( aName
.EqualsIgnoreCaseAscii("Helv"))
1444 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica" ));
1445 if (eFamily
==FAMILY_DONTKNOW
)
1446 eFamily
= FAMILY_SWISS
;
1448 else if (aName
.EqualsIgnoreCaseAscii("Tms Rmn"))
1450 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Times New Roman" ));
1451 if (eFamily
==FAMILY_DONTKNOW
)
1452 eFamily
= FAMILY_ROMAN
;
1454 else if (aName
.EqualsIgnoreCaseAscii("System Monospaced") )
1456 aName
.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Courier" ));
1457 ePitch
= PITCH_FIXED
;
1460 // nun koennen wir den font basteln: .........................
1461 return SvxFontItem(eFamily
, aName
, aEmptyStr
, ePitch
, eCharSet
, RES_CHRATR_FONT
);
1464 /////////////////////////////////////////////////////////////////// Dop
1465 void Ww1Dop::Out(Ww1Shell
& rOut
)
1468 // aDop.fWidowControlGet(); // keine Absatztrennung fuer einzelne Zeilen
1469 long nDefTabSiz
= aDop
.dxaTabGet();
1470 if (nDefTabSiz
< 56)
1473 // wir wollen genau einen DefaultTab
1474 SvxTabStopItem
aNewTab(1, USHORT(nDefTabSiz
), SVX_TAB_ADJUST_DEFAULT
, RES_PARATR_TABSTOP
);
1475 ((SvxTabStop
&)aNewTab
[0]).GetAdjustment() = SVX_TAB_ADJUST_DEFAULT
;
1476 rOut
.GetDoc().GetAttrPool().SetPoolDefaultItem( aNewTab
); //~ mdt: besser (GetDoc)
1478 SwFrmFmt
&rFmt
= rOut
.GetPageDesc().GetMaster();
1479 W1_DOP
& rDOP
= GetDOP();
1480 rOut
.GetPageDesc().SetLandscape(rDOP
.fWideGet());
1481 SwFmtFrmSize
aSz(rFmt
.GetFrmSize());
1482 aSz
.SetWidth(rDOP
.xaPageGet());
1483 aSz
.SetHeight(rDOP
.yaPageGet());
1484 rFmt
.SetFmtAttr(aSz
);
1485 SvxLRSpaceItem
aLR(rDOP
.dxaLeftGet()+rDOP
.dxaGutterGet(),
1486 rDOP
.dxaRightGet(), 0, 0, RES_LR_SPACE
);
1487 rFmt
.SetFmtAttr(aLR
);
1488 SvxULSpaceItem
aUL(rDOP
.dyaTopGet(), rDOP
.dyaBottomGet(), RES_UL_SPACE
);
1489 rFmt
.SetFmtAttr(aUL
);
1492 aInfo
= rOut
.GetDoc().GetFtnInfo(); // Copy-Ctor privat
1493 // wo positioniert ? ( 0 == Section, 1 == Page,
1494 // 2 == beim Text -> Page, 3 == Doc )
1495 switch( rDOP
.fpcGet() ){
1497 case 2: aInfo
.ePos
= FTNPOS_PAGE
; break;
1498 default: aInfo
.ePos
= FTNPOS_CHAPTER
; break;
1500 // aInfo.eNum = ( rDOP.fFtnRestartGet() ) ? FTNNUM_CHAPTER : FTNNUM_DOC;
1501 // Da Sw unter Chapter anscheinend was anderes versteht als PMW
1502 // hier also immer Doc !
1503 aInfo
.eNum
= FTNNUM_DOC
;
1504 // wie neu nummerieren ?
1505 // SW-UI erlaubt Nummer nur bei FTNNUM_DOC
1506 if( rDOP
.nFtnGet() > 0 && aInfo
.eNum
== FTNNUM_DOC
)
1507 aInfo
.nFtnOffset
= rDOP
.nFtnGet() - 1;
1508 rOut
.GetDoc().SetFtnInfo( aInfo
);
1512 ///////////////////////////////////////////////////////////////// Assoc
1513 void Ww1Assoc::Out(Ww1Shell
& rOut
)
1515 //~ mdt: fehlen: FileNext, Dot, DataDoc, HeaderDoc, Criteria1,
1516 // Criteria2, Criteria3, Criteria4, Criteria5, Criteria6, Criteria7
1517 SwDocShell
*pDocShell(rOut
.GetDoc().GetDocShell());
1518 DBG_ASSERT(pDocShell
, "no SwDocShell");
1520 uno::Reference
<document::XDocumentPropertiesSupplier
> xDPS(
1521 pDocShell
->GetModel(), uno::UNO_QUERY_THROW
);
1522 uno::Reference
<document::XDocumentProperties
> xDocProps(
1523 xDPS
->getDocumentProperties());
1524 DBG_ASSERT(xDocProps
.is(), "DocumentProperties is null");
1525 if (xDocProps
.is()) {
1526 xDocProps
->setTitle( GetStr(Title
) );
1527 xDocProps
->setSubject( GetStr(Subject
) );
1528 xDocProps
->setDescription( GetStr(Comments
) );
1529 xDocProps
->setKeywords(
1530 ::comphelper::string::convertCommaSeparated( GetStr(KeyWords
) ) );
1531 xDocProps
->setAuthor( GetStr(Author
) );
1532 xDocProps
->setModifiedBy( GetStr(LastRevBy
) );
1537 //////////////////////////////////////////////////////////// StyleSheet
1538 void Ww1StyleSheet::OutDefaults(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT stc
)
1542 rOut
<< SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE
);
1543 rOut
<< SvxFontItem(rMan
.GetFont(2));
1545 case 223: // annotation reference
1546 rOut
<< SvxFontHeightItem(160, 100, RES_CHRATR_FONTSIZE
);
1548 case 224: // annotation text
1549 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1551 case 225: // table of contents 8
1552 case 226: // table of contents 7
1553 case 227: // table of contents 6
1554 case 228: // table of contents 5
1555 case 229: // table of contents 4
1556 case 230: // table of contents 3
1557 case 231: // table of contents 2
1558 case 232: // table of contents 1
1559 rOut
<< SvxLRSpaceItem(( 232 - stc
) * 720, 720, 0, 0, RES_LR_SPACE
);
1560 // Tabulatoren fehlen noch !
1562 case 233: // index 7
1563 case 234: // und index 6
1564 case 235: // und index 5
1565 case 236: // und index 4
1566 case 237: // und index 3
1567 case 238: // und index 2
1568 rOut
<< SvxLRSpaceItem(( 239 - stc
) * 360, 0, 0, 0, RES_LR_SPACE
);
1570 case 239: // index 1
1572 case 240: // line number
1574 case 241: // index heading
1577 case 243:{ // ... und header
1578 SvxTabStopItem
aAttr(RES_PARATR_TABSTOP
);
1579 SvxTabStop aTabStop
;
1580 aTabStop
.GetTabPos() = 4535; // 8 cm
1581 aTabStop
.GetAdjustment() = SVX_TAB_ADJUST_CENTER
;
1582 aAttr
.Insert( aTabStop
);
1583 aTabStop
.GetTabPos() = 9071; // 16 cm
1584 aTabStop
.GetAdjustment() = SVX_TAB_ADJUST_RIGHT
;
1585 aAttr
.Insert( aTabStop
);
1589 case 244: // footnote reference
1590 rOut
<< SvxFontHeightItem(160, 100, RES_CHRATR_FONTSIZE
);
1591 rOut
<< SvxEscapementItem(6 * 100 / 24, 100, RES_CHRATR_ESCAPEMENT
);
1593 case 245: // footnote text
1594 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1596 case 246: // heading 9
1597 case 247: // und heading 8
1598 case 248: // und heading 7
1599 rOut
<< SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE
);
1600 rOut
<< SvxPostureItem(
1601 rOut
.GetPostureItalic()?ITALIC_NONE
:ITALIC_NORMAL
, RES_CHRATR_POSTURE
);
1602 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1604 case 249: // heading 6
1605 rOut
<< SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE
);
1606 rOut
<< SvxUnderlineItem(UNDERLINE_SINGLE
, RES_CHRATR_UNDERLINE
);
1607 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1609 case 250: // heading 5
1610 rOut
<< SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE
);
1611 rOut
<< SvxWeightItem(rOut
.GetWeightBold()?WEIGHT_NORMAL
:WEIGHT_BOLD
, RES_CHRATR_WEIGHT
);
1612 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1614 case 251: // heading 4
1615 rOut
<< SvxLRSpaceItem(360, 0, 0, 0, RES_LR_SPACE
);
1616 rOut
<< SvxUnderlineItem(UNDERLINE_SINGLE
, RES_CHRATR_UNDERLINE
);
1617 rOut
<< SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE
);
1619 case 252: // heading 3
1620 rOut
<< SvxLRSpaceItem(360, 0, 0, 0, RES_LR_SPACE
);
1621 rOut
<< SvxWeightItem(rOut
.GetWeightBold()?WEIGHT_NORMAL
:WEIGHT_BOLD
, RES_CHRATR_WEIGHT
);
1622 rOut
<< SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE
);
1624 case 253: // heading 2
1625 rOut
<< SvxULSpaceItem(120, 0, RES_UL_SPACE
);
1626 rOut
<< SvxWeightItem(rOut
.GetWeightBold()?WEIGHT_NORMAL
:WEIGHT_BOLD
, RES_CHRATR_WEIGHT
);
1627 rOut
<< SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE
);
1628 rOut
<< SvxFontItem(rMan
.GetFont(2));
1630 case 254: // heading 1
1631 rOut
<< SvxULSpaceItem(240, 0, RES_UL_SPACE
);
1632 rOut
<< SvxWeightItem(rOut
.GetWeightBold()?WEIGHT_NORMAL
:WEIGHT_BOLD
, RES_CHRATR_WEIGHT
);
1633 rOut
<< SvxUnderlineItem(UNDERLINE_SINGLE
, RES_CHRATR_UNDERLINE
);
1634 rOut
<< SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE
);
1635 rOut
<< SvxFontItem(rMan
.GetFont(2));
1637 case 255: // Normal indent
1638 rOut
<< SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE
);
1641 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1643 default: // selbstdefiniert
1644 rOut
<< SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE
);
1649 void Ww1StyleSheet::OutOne(Ww1Shell
& rOut
, Ww1Manager
& rMan
, USHORT stc
)
1651 const RES_POOL_COLLFMT_TYPE RES_NONE
= RES_POOLCOLL_DOC_END
;
1652 RES_POOL_COLLFMT_TYPE aType
= RES_NONE
;
1653 // aType = RES_POOLCOLL_JAKETADRESS; break;
1654 // aType = RES_POOLCOLL_LISTS_BEGIN; break;
1655 // aType = RES_POOLCOLL_SENDADRESS; break;
1656 // aType = RES_POOLCOLL_SIGNATURE; break;
1657 // aType = RES_POOLCOLL_TEXT_NEGIDENT; break;
1658 // aType = RES_POOLCOLL_TOX_IDXH; break;
1662 aType
= RES_POOLCOLL_TEXT
; break; //???
1663 case 223: // annotation reference
1665 case 224: // annotation text
1667 case 225: // table of contents 8
1668 aType
= RES_POOLCOLL_TOX_CNTNT8
; break;
1669 case 226: // table of contents 7
1670 aType
= RES_POOLCOLL_TOX_CNTNT7
; break;
1671 case 227: // table of contents 6
1672 aType
= RES_POOLCOLL_TOX_CNTNT6
; break;
1673 case 228: // table of contents 5
1674 aType
= RES_POOLCOLL_TOX_CNTNT5
; break;
1675 case 229: // table of contents 4
1676 aType
= RES_POOLCOLL_TOX_CNTNT4
; break;
1677 case 230: // table of contents 3
1678 aType
= RES_POOLCOLL_TOX_CNTNT3
; break;
1679 case 231: // table of contents 2
1680 aType
= RES_POOLCOLL_TOX_CNTNT2
; break;
1681 case 232: // table of contents 1
1682 aType
= RES_POOLCOLL_TOX_CNTNT1
; break;
1683 case 233: // index 7
1685 case 234: // index 6
1687 case 235: // index 5
1689 case 236: // index 4
1691 case 237: // index 3
1692 aType
= RES_POOLCOLL_TOX_IDX3
; break;
1693 case 238: // index 2
1694 aType
= RES_POOLCOLL_TOX_IDX2
; break;
1695 case 239: // index 1
1696 aType
= RES_POOLCOLL_TOX_IDX1
; break;
1697 case 240: // line number
1699 case 241: // index heading
1702 aType
= RES_POOLCOLL_FOOTER
; break;
1704 aType
= RES_POOLCOLL_HEADER
; break;
1705 case 244: // footnote reference
1707 case 245: // footnote text
1708 aType
= RES_POOLCOLL_FOOTNOTE
; break;
1709 case 246: // heading 9
1711 case 247: // heading 8
1713 case 248: // heading 7
1715 case 249: // heading 6
1717 case 250: // heading 5
1718 aType
= RES_POOLCOLL_HEADLINE5
; break;
1719 case 251: // heading 4
1720 aType
= RES_POOLCOLL_HEADLINE4
; break;
1721 case 252: // heading 3
1722 aType
= RES_POOLCOLL_HEADLINE3
; break;
1723 case 253: // heading 2
1724 aType
= RES_POOLCOLL_HEADLINE2
; break;
1725 case 254: // heading 1
1726 aType
= RES_POOLCOLL_HEADLINE1
; break;
1727 case 255: // Normal indent
1728 aType
= RES_POOLCOLL_TEXT_IDENT
; break;
1730 aType
= RES_POOLCOLL_STANDARD
; break;
1731 // aType = RES_POOLCOLL_TEXT; break; // Das ist "textkoerper"
1733 if (aType
== RES_NONE
)
1734 rOut
.BeginStyle(stc
, GetStyle(stc
).GetName() );
1736 rOut
.BeginStyle(stc
, aType
);
1737 OutDefaults(rOut
, rMan
, stc
);
1738 GetStyle(stc
).Out(rOut
, rMan
);
1740 // rMan.SetInApo(FALSE);
1742 // OutOneWithBase() liest einen Style mit OutOne() einen Style ein
1743 // Jedoch liest er, wenn noch nicht geschehen, den Basisstyle rekursiv ein
1744 void Ww1StyleSheet::OutOneWithBase(Ww1Shell
& rOut
, Ww1Manager
& rMan
,
1745 USHORT stc
, BYTE
* pbStopRecur
)
1747 // SH: lineares Einlesen ist Scheisse, da dann BasedOn nicht gesetzt
1748 // werden kann und ausserdem Toggle- und Modify-Attrs (z.B. Tabs ) nicht gehen.
1750 Ww1Style
& rSty
= GetStyle(stc
);
1751 USHORT nBase
= rSty
.GetnBase();
1753 && !rOut
.IsStyleImported( nBase
)
1754 && GetStyle(nBase
).IsUsed()
1755 && !pbStopRecur
[nBase
] ){
1757 pbStopRecur
[nBase
] = 1;
1758 OutOneWithBase( rOut
, rMan
, nBase
, pbStopRecur
); // Rekursiv
1760 OutOne( rOut
, rMan
, stc
);
1763 void Ww1StyleSheet::Out(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1766 BYTE bStopRecur
[256];
1767 memset( bStopRecur
, FALSE
, sizeof(bStopRecur
) );
1769 // 1. Durchlauf: Styles mit Basisstyles rekursiv
1770 for (stc
=0;stc
<Count();stc
++)
1771 if (GetStyle(stc
).IsUsed() && !rOut
.IsStyleImported( stc
) )
1772 OutOneWithBase( rOut
, rMan
, stc
, bStopRecur
);
1774 // 2. Durchlauf: Follow-Styles
1775 for (stc
=0;stc
<Count();stc
++){
1776 Ww1Style
& rSty
= GetStyle(stc
);
1777 if ( rSty
.IsUsed() ){
1778 USHORT nNext
= rSty
.GetnNext();
1779 if( nNext
!= stc
&& GetStyle(nNext
).IsUsed() )
1780 rOut
.NextStyle( stc
, nNext
);
1785 ////////////////////////////////////////////////////////////// Picture
1786 static ULONG
GuessPicSize(W1_PIC
* pPic
)
1788 USHORT maxx
= pPic
->mfp
.xExtGet();
1789 USHORT padx
= ((maxx
+ 7) / 8) * 8;
1790 USHORT maxy
= pPic
->mfp
.yExtGet();
1791 return 120L + (ULONG
)padx
* maxy
;
1795 // folgende methode schreibt eine windows-.BMP-datei aus einem
1796 // embeddeten bild in ww-1 dateien
1797 // gelesen wird 4-bit format, geschrieben jedoch 8-bit.
1799 void Ww1Picture::WriteBmp(SvStream
& rOut
)
1801 long nSize
= pPic
->lcbGet() - (sizeof(*pPic
)-sizeof(pPic
->rgb
));
1802 BYTE
* p
= pPic
->rgbGet();
1803 USHORT maxx
= pPic
->mfp
.xExtGet();
1804 USHORT padx
= ((maxx
+ 7) / 8) * 8;
1805 USHORT maxy
= pPic
->mfp
.yExtGet();
1807 /*USHORT unknown1 = SVBT16ToShort(p);*/ p
+= sizeof(SVBT16
); nSize
-= sizeof(SVBT16
);
1808 /*USHORT unknown2 = SVBT16ToShort(p);*/ p
+= sizeof(SVBT16
); nSize
-= sizeof(SVBT16
);
1809 #if OSL_DEBUG_LEVEL > 1
1810 USHORT x
= SVBT16ToShort(p
);
1813 p
+= sizeof(SVBT16
); nSize
-= sizeof(SVBT16
);
1814 #if OSL_DEBUG_LEVEL > 1
1815 USHORT y
= SVBT16ToShort(p
);
1818 p
+= sizeof(SVBT16
); nSize
-= sizeof(SVBT16
);
1819 #if OSL_DEBUG_LEVEL > 1
1820 USHORT planes
= SVBT16ToShort(p
);
1823 p
+= sizeof(SVBT16
); nSize
-= sizeof(SVBT16
);
1824 #if OSL_DEBUG_LEVEL > 1
1825 USHORT bitcount
= SVBT16ToShort(p
);
1828 p
+= sizeof(SVBT16
); nSize
-= sizeof(SVBT16
);
1830 #if OSL_DEBUG_LEVEL > 1
1831 DBG_ASSERT(x
==maxx
, "Ww1Picture");
1832 DBG_ASSERT(y
==maxy
, "Ww1Picture");
1833 DBG_ASSERT(planes
==1, "Ww1Picture");
1834 DBG_ASSERT(bitcount
==4, "Ww1Picture");
1837 DBG_ASSERT(16*3+padx
*maxy
/2==nSize
, "Ww1Picture");
1843 UInt32ToSVBT32(n, tmpLong); \
1844 if ((rOut.Write(tmpLong, sizeof(SVBT32))) != sizeof(SVBT32)) goto error;
1846 ShortToSVBT16(n, tmpShort); \
1847 if ((rOut.Write(tmpShort, sizeof(SVBT16))) != sizeof(SVBT16)) goto error;
1849 ByteToSVBT8(n, tmpByte); \
1850 if ((rOut.Write(tmpByte, sizeof(SVBT8))) != sizeof(SVBT8)) goto error;
1851 wByte('B'); wByte('M');
1852 wLong(54 + 4 * 16 + padx
* maxy
);
1867 for (i
=0;nSize
>0&&i
<16;i
++)
1871 nSize
-= sizeof(BYTE
);
1874 nSize
-= sizeof(BYTE
);
1877 nSize
-= sizeof(BYTE
);
1880 DBG_ASSERT(padx
*maxy
/2==nSize
, "Ww1Picture");
1884 BYTE
* pBuf
= new BYTE
[padx
];
1885 for (j
=0;nSize
>0&&j
<maxy
;j
++)
1888 for (i
=0;nSize
>0&&i
<maxx
;i
+=2)
1893 nSize
-= sizeof(BYTE
);
1899 nSize
-= sizeof(BYTE
);
1901 if(rOut
.Write(pBuf
, padx
) != padx
){
1909 for (j
=0;nSize
>0&&j
<maxy
;j
++)
1911 for (i
=0;nSize
>0&&i
<maxx
;i
+=2)
1916 nSize
-= sizeof(BYTE
);
1922 nSize
-= sizeof(BYTE
);
1926 DBG_ASSERT(nSize
==0, "Ww1Picture");
1936 void Ww1Picture::Out(Ww1Shell
& rOut
, Ww1Manager
& /*rMan*/)
1938 Graphic
* pGraphic
= 0;
1940 switch (mm
= pPic
->mfp
.mmGet())
1942 case 8: // embedded metafile
1944 SvMemoryStream
aOut(8192, 8192);
1945 aOut
.Write(pPic
->rgbGet(), pPic
->lcbGet() -
1946 (sizeof(*pPic
)-sizeof(pPic
->rgb
)));
1949 if (ReadWindowMetafile( aOut
, aWMF
, NULL
) && aWMF
.GetActionCount() > 0)
1951 aWMF
.SetPrefMapMode(MapMode(MAP_100TH_MM
));
1952 Size
aOldSiz(aWMF
.GetPrefSize());
1953 Size
aNewSiz(pPic
->mfp
.xExtGet(), pPic
->mfp
.yExtGet());
1954 Fraction
aFracX(aNewSiz
.Width(), aOldSiz
.Width());
1955 Fraction
aFracY(aNewSiz
.Height(), aOldSiz
.Height());
1956 aWMF
.Scale(aFracX
, aFracY
);
1957 aWMF
.SetPrefSize(aNewSiz
);
1958 pGraphic
= new Graphic(aWMF
);
1962 case 94: // embedded name SH:??? Was denn nun ? Embeddet oder Name ?
1963 case 98: // TIFF-Name
1965 String
aDir( (sal_Char
*)pPic
->rgbGet(),
1966 (USHORT
)(pPic
->lcbGet() - (sizeof(*pPic
)-sizeof(pPic
->rgb
))),
1967 RTL_TEXTENCODING_MS_1252
);
1968 //SvFileStream aOut(aDir, STREAM_READ|STREAM_WRITE|STREAM_TRUNC);
1969 rOut
.AddGraphic( aDir
);
1972 case 97: // embedded bitmap
1973 // case 99: // SH: bei meinem BspDoc 41738.doc auch embedded Bitmap,
1974 // aber leider anderes Format
1976 ULONG nSiz
= GuessPicSize(pPic
);
1977 SvMemoryStream
aOut(nSiz
, 8192);
1981 pGraphic
= new Graphic(aBmp
);
1984 DBG_ASSERT(pPic
->mfp
.mmGet() == 97, "Ww1Picture");
1990 ////////////////////////////////////////////////////////// HeaderFooter
1991 void Ww1HeaderFooter::Start(Ww1Shell
& rOut
, Ww1Manager
& rMan
)
1993 // wird sowieso nur bei SEPs aufgerufen, keine weitere pruefung
1998 switch (eHeaderFooterMode
)
2012 if (FillOddHeadL(begin
, end
))
2014 Ww1HddText
* pText
= new Ww1HddText(rMan
.GetFib());
2016 pText
->SetCount(end
-begin
);
2018 rMan
.Push1(pText
, pText
->Offset(rMan
.GetFib()), begin
,
2019 new Ww1HeaderFooterFields(rMan
.GetFib()));
2022 rOut
.EndHeaderFooter();
2033 if (FillOddFootL(begin
, end
))
2035 Ww1HddText
* pText
= new Ww1HddText(rMan
.GetFib());
2037 pText
->SetCount(end
-begin
);
2039 rMan
.Push1(pText
, pText
->Offset(rMan
.GetFib()), begin
,
2040 new Ww1HeaderFooterFields(rMan
.GetFib()));
2043 rOut
.EndHeaderFooter();
2056 void Ww1HeaderFooter::Stop(Ww1Shell
& rOut
, Ww1Manager
& rMan
, sal_Unicode
&)
2058 if (!rMan
.Pushed() && eHeaderFooterMode
!= None
2059 // && rMan.GetText().Where() >= rMan.GetText().Count()