LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sw/source/filter/ww1 - w1filter.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 1034 0.1 %
Date: 2013-07-09 Functions: 2 43 4.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : #include <tools/solar.h>
      22             : #include <comphelper/string.hxx>
      23             : #include <editeng/paperinf.hxx>
      24             : #include <vcl/graphicfilter.hxx>
      25             : #include <vcl/graph.hxx>
      26             : #include <vcl/wmf.hxx>
      27             : #include <editeng/fontitem.hxx>
      28             : #include <editeng/lrspitem.hxx>
      29             : #include <editeng/ulspitem.hxx>
      30             : #include <editeng/wghtitem.hxx>
      31             : #include <editeng/postitem.hxx>
      32             : #include <editeng/crossedoutitem.hxx>
      33             : #include <editeng/contouritem.hxx>
      34             : #include <editeng/cmapitem.hxx>
      35             : #include <editeng/fhgtitem.hxx>
      36             : #include <editeng/udlnitem.hxx>
      37             : #include <editeng/wrlmitem.hxx>
      38             : #include <editeng/colritem.hxx>
      39             : #include <editeng/kernitem.hxx>
      40             : #include <editeng/escapementitem.hxx>
      41             : #include <editeng/tstpitem.hxx>
      42             : #include <svl/urihelper.hxx>
      43             : #include <fmtfsize.hxx>
      44             : #include <doc.hxx>
      45             : #include <pam.hxx>
      46             : #include <ndtxt.hxx>
      47             : #include <pagedesc.hxx>
      48             : #include <flddat.hxx>
      49             : #include <reffld.hxx>
      50             : #include <expfld.hxx>
      51             : #include <docufld.hxx>
      52             : #include <ftninfo.hxx>
      53             : #include <section.hxx>          // class SwSection
      54             : #include <fltini.hxx>
      55             : #include <w1par.hxx>
      56             : #include <docsh.hxx>
      57             : #include <swerror.h>
      58             : #include <mdiexp.hxx>
      59             : #include <statstr.hrc>
      60             : #include <stdio.h>
      61             : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
      62             : #include <com/sun/star/document/XDocumentProperties.hpp>
      63             : #include <vcl/dibtools.hxx>
      64             : 
      65             : #define MAX_FIELDLEN 64000
      66             : 
      67             : using namespace css;
      68             : using namespace nsSwDocInfoSubType;
      69             : 
      70             : 
      71             : ///////////////////////////////////////////////////////////////////////
      72             : //
      73             : // hier stehen die methoden operator<<, Out, Start und Stop mit
      74             : // folgender Bedeutung: wenn moeglich wird die information aus dem
      75             : // dokument per
      76             : //   operator<<()
      77             : // in die shell uebertragen. sind jedoch weitere parameter noetig
      78             : // wurde der name
      79             : //   Out()
      80             : // gewaehlt. ist ein bereich zu kennzeichnen (zB bei attributen
      81             : // von/bis), heissen die methoden
      82             : //   Start(), Stop()
      83             : // alle diese methoden stehen in diesem modul, das fuer den filter,
      84             : // jedoch nicht fuer den dumper noetig ist.  und da alle regeln ihre
      85             : // ausnahme haben: hier stehen auch methoden, die aus anderen gruenden
      86             : // fuer den dumper sinnlos sind, zB wenn sie auf sv-strukturen beruhen
      87             : // wie zB GetFont() auf SvxFontItem.
      88             : //
      89             : 
      90             : /////////////////////////////////////////////////////////////// Manager
      91           0 : Ww1Shell& operator <<(Ww1Shell& rOut, Ww1Manager& This)
      92             : {
      93             :     // verhindern, das bei rekusivem aufruf dies mehrfach passiert:
      94           0 :     if (!This.Pushed())
      95             :     {
      96             :         { // der wird nur temporaer gebraucht:
      97           0 :             This.SetInStyle( true );
      98           0 :             Ww1StyleSheet(This.aFib).Out(rOut, This);
      99           0 :             This.SetInStyle( false );
     100             :         }
     101             :         { // dieser auch:
     102           0 :             Ww1Assoc(This.aFib).Out(rOut);
     103             :         }
     104             :           // dieser nicht, der ist bereits member:
     105           0 :         This.aDop.Out(rOut);
     106             :           // Jetzt entscheiden, wie Seitenvorlagen erzeugt werden
     107           0 :         if (This.GetSep().Count() <= 1)
     108           0 :             rOut.SetUseStdPageDesc();
     109             :     }
     110             :     // und jetzt das eigentliche dok:
     111           0 :     sal_Unicode cUnknown = ' ';
     112           0 :     while (*This.pSeek < This.pDoc->Count())
     113             :     {
     114             :     // ausgabe des ProgressState nur, wenn im haupttext, da sonst
     115             :     // nicht bestimmt werden kann, wie weit wir sind:
     116           0 :         if (!This.Pushed())
     117           0 :             ::SetProgressState(This.Where() * 100 / This.pDoc->Count(),
     118           0 :              rOut.GetDoc().GetDocShell());
     119             :     // hier werden abwechselnd die attribute und die zeichen in die
     120             :     // shell gepumpt.  die positionen werden durch das lesen der
     121             :     // zeichen aus dem manager hoch- gezaehlt.  erst alle attribute:
     122           0 :         This.Out(rOut, cUnknown);
     123             :     // das textdocument pDoc ist ein Ww1PlainText, dessen Out()
     124             :     // methode solange ausgibt, bis entweder ein sonderzeichen
     125             :     // auftaucht oder die anzahl der auszugebenden zeichen erreicht
     126             :     // ist:
     127           0 :         cUnknown = This.pDoc->Out(rOut, *This.pSeek);
     128             :     }
     129           0 :     This.SetStopAll(true);
     130           0 :     This.OutStop(rOut, cUnknown);   // Damit die Attribute am Ende geschlossen
     131           0 :     This.SetStopAll(false);         // werden
     132           0 :     return rOut;
     133             : }
     134             : 
     135           0 : void Ww1Manager::OutStop(Ww1Shell& rOut, sal_Unicode cUnknown)
     136             : {
     137             :                         // Bookmarks brauchen nicht beendet werden ???
     138           0 :     if (pFld)
     139           0 :         pFld->Stop(rOut, *this, cUnknown);
     140           0 :     if (!Pushed())
     141           0 :         aFtn.Stop(rOut, *this, cUnknown);
     142             :     if (1)
     143           0 :         aChp.Stop(rOut, *this, cUnknown);
     144             :     if (1)
     145           0 :         aPap.Stop(rOut, *this, cUnknown);
     146           0 :     if (!Pushed())
     147           0 :         aSep.Stop(rOut, *this, cUnknown);
     148           0 : }
     149             : 
     150           0 : void Ww1Manager::OutStart( Ww1Shell& rOut )
     151             : {
     152             : // alle attribute, die's brauchen beginnen
     153           0 :     if (!Pushed())
     154           0 :         aSep.Start(rOut, *this);
     155             :     if (1)
     156           0 :         aPap.Start(rOut, *this);
     157             :     if (1)
     158           0 :         aChp.Start(rOut, *this);
     159           0 :     if (!Pushed())
     160           0 :         aFtn.Start(rOut, *this);
     161           0 :     if (pFld)
     162           0 :         pFld->Start(rOut, *this);
     163           0 :     if (!Pushed())
     164           0 :         aBooks.Start(rOut, *this);
     165             : // bestimmen, wo das naechste Ereigniss ist:
     166           0 :     sal_uLong ulEnd = pDoc->Count(); // spaetestens am textende
     167           0 :     if (!Pushed())
     168           0 :         if (ulEnd > aSep.Where()) // naechster Sep vorher?
     169           0 :             ulEnd = aSep.Where();
     170             :     if (1)
     171           0 :         if (ulEnd > aPap.Where()) // naechster Pap vorher?
     172           0 :             ulEnd = aPap.Where();
     173             :     if (1)
     174           0 :         if (ulEnd > aChp.Where()) // naechster Chp vorher?
     175           0 :             ulEnd = aChp.Where();
     176           0 :     if (!Pushed())
     177           0 :         if (ulEnd > aFtn.Where()) // naechster Ftn vorher?
     178           0 :             ulEnd = aFtn.Where();
     179           0 :     if (pFld)
     180           0 :         if (ulEnd > pFld->Where()) // naechster Fld vorher?
     181           0 :             ulEnd = pFld->Where();
     182           0 :     if (!Pushed())
     183           0 :         if (ulEnd > aBooks.Where()) // naechster Bookmark vorher?
     184           0 :             ulEnd = aBooks.Where();
     185           0 :     *pSeek = Where(); // momentane position
     186           0 :     if (*pSeek < ulEnd) // sind wir bereits weiter?
     187           0 :         *pSeek = ulEnd;
     188           0 : }
     189             : 
     190           0 : void Ww1Manager::Out(Ww1Shell& rOut, sal_Unicode cUnknown)
     191             : {
     192             : // Je nach modus wird hier mit feldern, fusznoten, zeichenattributen,
     193             : // absatzatributen und sektionen wie folgt verfahren: von allen wird
     194             : // zuallererst die stop-methoden gerufen. stellt das objekt fest, dasz
     195             : // etwas zu beenden ist (natuerlich nicht im ersten durchgang) beendet
     196             : // es dies, ansonsten ist der aufruf wirkungslos.  dann werden
     197             : // unbehandelte sonderzeichen augegeben. das werden genauso alle
     198             : // start-methoden gerufen und danach per where festgestellt, an
     199             : // welcher stelle die naechste aktion zu erwarten ist.
     200             : //
     201             : // ist der manager in einem ge'push'ten mode, werden bestimmte
     202             : // elemente ausgeklammert. felder werden wiederum nur in besonderen
     203             : // faellen augeklammert, wenn naemlich bereiche ausgegeben werden, die
     204             : // keine felder enthalten koennen. charakterattribute und
     205             : // paragraphenattribute werden jedoch nie ausgeklammert. die if (1)
     206             : // wurden zur verdeutlichung der einheitlichkeit eingefuegt.
     207             : 
     208             : // Erstmal eine Sonderbehandlung fuer Tabellen:
     209             : // die wichtigen Attribute lassen sich am Besten vor Beendigung derselben
     210             : // abfragen.
     211             : // Optimierung: Sie werden nur auf sinnvolle Werte gesetzt, wenn
     212             : // das 0x07-Zeiche ansteht.
     213             : 
     214           0 :     bool bLIsTtp = false;
     215           0 :     sal_Bool bLHasTtp = sal_False;
     216           0 :     if( cUnknown == 0x07 )
     217             :     {
     218           0 :         bLIsTtp = IsInTtp();
     219           0 :         bLHasTtp = HasTtp();
     220             :     }
     221             : 
     222           0 :     OutStop( rOut, cUnknown );      // Attrs ggfs. beenden
     223             : 
     224             : // meta-zeichen interpretieren:
     225           0 :     if (!Ww1PlainText::IsChar(cUnknown))
     226           0 :         switch (cUnknown)
     227             :         {
     228             :         case 0x02:
     229             :             // dontknow
     230           0 :         break;
     231             :         case 0x07: // table
     232           0 :             if (rOut.IsInTable() && HasInTable() && !bLIsTtp && !bLHasTtp)
     233           0 :                 rOut.NextTableCell();
     234           0 :         break;
     235             :         case 0x09: // tab
     236           0 :             rOut.NextTab();
     237           0 :         break;
     238             :         case 0x0a: // linefeed
     239           0 :             rOut.NextParagraph();
     240           0 :         break;
     241             :         case 0x0b: // linebreak
     242           0 :             if (rOut.IsInTable())
     243             :                 ;
     244             :             else
     245           0 :                 rOut.NextLine();
     246           0 :         break;
     247             :         case 0x0d: // carriage return
     248             :             // ignore
     249           0 :         break;
     250             :         case 0x0c: // pagebreak
     251           0 :             rOut.NextPage();
     252           0 :         break;
     253             :         case 0x14: // sectionendchar
     254             :             // ignore here
     255           0 :         break;
     256             :         default:
     257           0 :         break;
     258             :         }
     259             : 
     260           0 :     OutStart( rOut );   // Attrs ggfs. starten und Naechste Pos berechnen
     261           0 : }
     262             : 
     263           0 : SvxFontItem Ww1Manager::GetFont(sal_uInt16 nFCode)
     264             : {
     265           0 :     return aFonts.GetFont(nFCode);
     266             : }
     267             : 
     268           0 : void Ww1Manager::Push0(Ww1PlainText* _pDoc, sal_uLong ulSeek, Ww1Fields* _pFld)
     269             : {
     270             :     OSL_ENSURE(!Pushed(), "Ww1Manager");
     271           0 :     this->pDoc = _pDoc;
     272           0 :     pSeek = new sal_uLong;
     273           0 :     *pSeek = pDoc->Where();
     274           0 :     aPap.Push(ulSeek);
     275           0 :     aChp.Push(ulSeek);
     276           0 :     this->pFld = _pFld;
     277           0 : }
     278             : 
     279             : // ulSeek ist der FC-Abstand zwischen Hauptest-Start und Sondertext-Start
     280             : // ulSeek2 ist der Offset dieses bestimmten Sondertextes im Sondertext-Bereich,
     281             : // also z.B. der Offset des speziellen K/F-Textes
     282           0 : void Ww1Manager::Push1(Ww1PlainText* _pDoc, sal_uLong ulSeek, sal_uLong ulSeek2,
     283             :                        Ww1Fields* _pFld)
     284             : {
     285             :     OSL_ENSURE(!Pushed(), "Ww1Manager");
     286           0 :     this->pDoc = _pDoc;
     287           0 :     pSeek = new sal_uLong;
     288           0 :     *pSeek = pDoc->Where();
     289           0 :     aPap.Push(ulSeek + ulSeek2);
     290           0 :     aChp.Push(ulSeek + ulSeek2);
     291           0 :     if( _pFld )
     292           0 :         _pFld->Seek( ulSeek2 );
     293           0 :     this->pFld = _pFld;
     294           0 : }
     295             : 
     296           0 : void Ww1Manager::Pop()
     297             : {
     298             :     OSL_ENSURE(Pushed(), "Ww1Manager");
     299           0 :     delete pDoc;
     300           0 :     pDoc = &aDoc;
     301           0 :     delete pSeek;
     302           0 :     pSeek = &ulDocSeek;
     303           0 :     aChp.Pop();
     304           0 :     aPap.Pop();
     305           0 :     delete pFld;
     306           0 :     pFld = &aFld;
     307           0 : }
     308             : 
     309             : ///////////////////////////////////////////////////////////// Bookmarks
     310             : 
     311           0 : void Ww1Bookmarks::Out(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16)
     312             : {
     313           0 :     if (GetIsEnd())
     314             :     {
     315           0 :         rOut.SetBookEnd(GetHandle());
     316           0 :         return;
     317             :     }
     318             : 
     319           0 :     const String & rName = GetName();
     320           0 :     if( rName.EqualsAscii( "_Toc", 0, 4 ) ) // "_Toc*" ist ueberfluessig
     321           0 :         return;
     322             : 
     323           0 :     if( rOut.IsFlagSet( SwFltControlStack::HYPO )
     324           0 :         && rName.EqualsIgnoreCaseAscii( "FORMULAR" ) )
     325           0 :         rOut.SetProtect();
     326             : 
     327             :     // Fuer UEbersetzung Bookmark -> Variable setzen
     328           0 :     long nLen = Len();
     329           0 :     if( nLen > MAX_FIELDLEN )
     330           0 :         nLen = MAX_FIELDLEN;
     331             : 
     332             :     // Lese Inhalt des Bookmark
     333             :     // geht vermulich auch ueber Ww1PlainText
     334           0 :     String aVal( rMan.GetText().GetText( Where(), nLen ) );
     335             : 
     336             :     // in 2 Schritten, da OS/2 zu doof ist
     337           0 :     SwFltBookmark aBook( rName, aVal, GetHandle(), sal_False );
     338           0 :     rOut << aBook;
     339             : }
     340             : 
     341           0 : void Ww1Bookmarks::Start(Ww1Shell& rOut, Ww1Manager& rMan)
     342             : {
     343           0 :     if (rMan.Where() >= Where())
     344             :     {
     345           0 :         Out(rOut, rMan);
     346           0 :         ++(*this);
     347             :     }
     348           0 : }
     349             : 
     350             : ///////////////////////////////////////////////////////////// Footnotes
     351           0 : void Ww1Footnotes::Start(Ww1Shell& rOut, Ww1Manager& rMan)
     352             : {
     353           0 :     if (rMan.Where() >= Where())
     354             :     {
     355             :         OSL_ENSURE(nPlcIndex < Count(), "WwFootnotes");
     356             :         sal_Unicode c;
     357           0 :         rMan.Fill(c);
     358             :         OSL_ENSURE(c==0x02, "Ww1Footnotes");
     359           0 :         if (c==0x02)
     360             :         {
     361           0 :             Ww1FtnText* pText = new Ww1FtnText(rMan.GetFib());
     362             :         // beginn des textes dieser fusznote:
     363           0 :             sal_uLong start = aText.Where(nPlcIndex);
     364           0 :             pText->Seek(start);
     365             :         // laenge des textes
     366           0 :             sal_uLong count = aText.Where(nPlcIndex+1) - start;
     367           0 :             pText->SetCount(count);
     368             :         // fusznotenkennung sollte das erste byte sein
     369           0 :             pText->Out(c);
     370             :             OSL_ENSURE(c==0x02, "Ww1Footnotes");
     371           0 :             count--; // fuer das eben gelesene kenn-byte
     372             :         // fusznoten mode beginnen:
     373           0 :             rOut.BeginFootnote();
     374           0 :             bStarted = sal_True;
     375           0 :             rMan.Push0(pText, pText->Offset(rMan.GetFib()),
     376           0 :              new Ww1FootnoteFields(rMan.GetFib()));
     377           0 :             rOut << rMan;
     378           0 :             rMan.Pop();
     379           0 :             rOut.EndFootnote();
     380             :         }
     381             :         else
     382           0 :             ++(*this);
     383             :     }
     384           0 : }
     385             : 
     386           0 : void Ww1Footnotes::Stop(Ww1Shell& /*rOut*/, Ww1Manager& rMan, sal_Unicode& c)
     387             : {
     388           0 :     if (bStarted && rMan.Where() > Where())
     389             :     {
     390             :         OSL_ENSURE(nPlcIndex < Count(), "Ww1Footnotes");
     391           0 :         c = ' ';
     392           0 :         ++(*this);
     393             :     }
     394           0 : }
     395             : 
     396             : //////////////////////////////////////////////////////////////// Fields
     397           0 : void Ww1Fields::Start(Ww1Shell& rOut, Ww1Manager& rMan)
     398             : {
     399           0 :     if (rMan.Where() >= Where()){
     400             :         OSL_ENSURE(nPlcIndex < Count(), "Ww1Fields");
     401           0 :         if (GetData()->chGet() == 19)
     402           0 :             Out(rOut, rMan);
     403             :         else
     404           0 :             ++(*this); // ignore
     405             :     }
     406           0 : }
     407             : 
     408           0 : void Ww1Fields::Stop( Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode& c)
     409             : {
     410           0 :     if (rMan.Where() >= Where())
     411             :     {
     412             :         OSL_ENSURE(nPlcIndex < Count(), "Ww1Fields");
     413           0 :         if (GetData()->chGet() != 19)
     414             :         {
     415           0 :             rMan.Fill( c );
     416             :             OSL_ENSURE(c==21, "Ww1Fields");
     417           0 :             ++(*this);
     418           0 :             c = ' ';
     419           0 :             if (pField)
     420             :             // haben wir ein fertiges feld da, das  eingefuegt werden soll?
     421             :             {
     422           0 :                 rOut << *pField;
     423           0 :                 delete pField;
     424           0 :                 pField = 0;
     425             :             // das macht der filter so, damit attribute die ueber das feld
     426             :             // gelten auch wirklich eingelesen werden und dem feld
     427             :             // zugeordnet werden.
     428             :             }
     429           0 :             if (sErgebnis.Len())
     430           0 :                 rOut << sErgebnis;
     431             :         }
     432             :     }
     433           0 : }
     434             : 
     435             : enum WWDateTime{ WW_DONTKNOW = 0x0, WW_DATE = 0x1, WW_TIME = 0x2, WW_BOTH = 0x3 };
     436             : 
     437           0 : static WWDateTime GetTimeDatePara( const String& rForm,
     438             :                                     SwTimeFormat* pTime = 0,
     439             :                                      SwDateFormat* pDate = 0 )
     440             : {
     441           0 :     WWDateTime eDT = WW_BOTH;
     442           0 :     if( STRING_NOTFOUND == rForm.Search( 'H' ))         // H    -> 24h
     443             :     {
     444           0 :         if( pTime )
     445           0 :             *pTime = TF_SSMM_24;
     446             :     }
     447           0 :     else if( STRING_NOTFOUND == rForm.Search( 'H' ))    // h    -> 24h
     448             :     {
     449           0 :         if( pTime )
     450           0 :             *pTime = TF_SSMM_12;
     451             :     }
     452             :     else                                    // keine Zeit
     453             :     {
     454           0 :         eDT = (WWDateTime)( eDT & ~(sal_uInt16)WW_TIME );
     455             :     }
     456             : 
     457           0 :     xub_StrLen nDPos = 0;
     458           0 :     while( STRING_NOTFOUND != nDPos )
     459             :     {
     460           0 :         nDPos = rForm.Search( 'M', nDPos );     // M    -> Datum
     461           0 :         if( !nDPos )
     462           0 :             break;
     463           0 :         sal_Unicode cPrev = rForm.GetChar( nDPos - 1 );
     464             :         // ignoriere dabei "AM", "aM", "PM", "pM"
     465           0 :         if( 'a' != cPrev && 'A' != cPrev && 'p' != cPrev && 'P' != cPrev )
     466           0 :             break;
     467             :         // else search again
     468           0 :         ++nDPos;
     469             :     }
     470             : 
     471           0 :     if( STRING_NOTFOUND != nDPos )                  // Monat -> Datum ?
     472             :     {
     473             :         static SwDateFormat const aDateA[32] =
     474             :         {
     475             :             DFF_DMY, DFF_DMMY, DFF_DMYY, DFF_DMMYY,
     476             :             DFF_DMMMY, DFF_DMMMY, DFF_DMMMYY, DFF_DMMMYY,
     477             :             DFF_DDMMY, DFF_DDMMY, DFF_DDMMMYY, DFF_DDMMMYY,
     478             :             DFF_DDMMMY, DFF_DDMMMY, DFF_DDMMMYY, DFF_DDMMMYY,
     479             :             DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY,
     480             :             DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY,
     481             :             DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY,
     482             :             DFF_DDDMMMY, DFF_DDDMMMY, DFF_DDDMMMYY, DFF_DDDMMMYY
     483             :         };
     484             : 
     485           0 :         bool bHasDay = STRING_NOTFOUND != rForm.Search( 't' ) ||
     486           0 :                        STRING_NOTFOUND != rForm.Search( 'T' ) ||
     487           0 :                        STRING_NOTFOUND != rForm.Search( 'd' ) ||
     488           0 :                        STRING_NOTFOUND != rForm.Search( 'D' );
     489             : 
     490           0 :         sal_Bool bLongDayOfWeek= STRING_NOTFOUND != rForm.SearchAscii( "tttt" ) ||
     491           0 :                                STRING_NOTFOUND != rForm.SearchAscii( "TTTT" ) ||
     492           0 :                                STRING_NOTFOUND != rForm.SearchAscii( "dddd" ) ||
     493           0 :                                STRING_NOTFOUND != rForm.SearchAscii( "DDDD" );
     494             : 
     495           0 :         sal_Bool bDayOfWeek = STRING_NOTFOUND != rForm.SearchAscii( "ttt" ) ||
     496           0 :                           STRING_NOTFOUND != rForm.SearchAscii( "TTT" ) ||
     497           0 :                           STRING_NOTFOUND != rForm.SearchAscii( "ddd" ) ||
     498           0 :                           STRING_NOTFOUND != rForm.SearchAscii( "DDD" );
     499             : 
     500             :                     //  M, MM -> numeric month
     501             :                     //  MMM, MMMM -> text. month
     502           0 :         sal_Bool bLitMonth = STRING_NOTFOUND != rForm.SearchAscii( "MMM" );
     503             :                     //  MMMM -> full month
     504           0 :         sal_Bool bFullMonth = STRING_NOTFOUND != rForm.SearchAscii( "MMMM" );
     505             :                     //  jj, JJ -> 2-col-year
     506             :                     //  jjjj, JJJJ -> 4-col-year
     507           0 :         sal_Bool bFullYear = STRING_NOTFOUND != rForm.SearchAscii( "jjj" ) ||
     508           0 :                          STRING_NOTFOUND != rForm.SearchAscii( "JJJ" ) ||
     509           0 :                          STRING_NOTFOUND != rForm.SearchAscii( "yyy" ) ||
     510           0 :                          STRING_NOTFOUND != rForm.SearchAscii( "YYY" );
     511             : 
     512             :         sal_uInt16 i = ( bLitMonth & 1 )
     513           0 :                    | ( ( bFullYear & 1 ) << 1 )
     514           0 :                    | ( ( bFullMonth & 1 ) << 2 )
     515           0 :                    | ( ( bDayOfWeek & 1 ) << 3 )
     516           0 :                    | ( ( bLongDayOfWeek & 1 ) << 4 );
     517           0 :         if( pDate )
     518             :         {
     519           0 :             if( !bHasDay && !bFullMonth )
     520           0 :                 *pDate = DFF_MY;
     521             :             else
     522           0 :                 *pDate = aDateA[i];
     523             :         }
     524             :     }
     525             :     else
     526             :     {
     527           0 :         eDT = (WWDateTime)( eDT & ~(sal_uInt16)WW_DATE );
     528             :     }
     529           0 :     return eDT;
     530             : }
     531             : 
     532             : 
     533             : extern void sw3io_ConvertFromOldField( SwDoc& rDoc, sal_uInt16& rWhich,
     534             :                                 sal_uInt16& rSubType, sal_uLong &rFmt,
     535             :                                 sal_uInt16 nVersion );
     536             : 
     537           0 : void Ww1Fields::Out(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 nDepth)
     538             : {
     539           0 :     String sType; // der typ als string
     540           0 :     String sFormel; // die formel
     541           0 :     String sFormat;
     542           0 :     String sDTFormat;   // Datum / Zeit-Format
     543           0 :     W1_FLD* pData = GetData(); // die an den plc gebunden daten
     544             :     OSL_ENSURE(pData->chGet()==19, "Ww1Fields"); // sollte beginn sein
     545             : 
     546             :     sal_Unicode c;
     547           0 :     rMan.Fill( c );
     548             :     OSL_ENSURE(c==19, "Ww1Fields"); // sollte auch beginn sein
     549           0 :     if (pData->chGet()==19 && c == 19)
     550             :     {
     551           0 :         String aStr;
     552           0 :         c = rMan.Fill( aStr, GetLength() );
     553             :         OSL_ENSURE(Ww1PlainText::IsChar(c), "Ww1Fields");
     554           0 :         xub_StrLen pos = aStr.Search(' ');
     555             :         // get type out of text
     556           0 :         sType = aStr.Copy( 0, pos );
     557           0 :         aStr.Erase( 0, pos );
     558           0 :         if ( pos != STRING_NOTFOUND )
     559           0 :             aStr.Erase(0, 1);
     560           0 :         sFormel += aStr;
     561           0 :         sal_uInt8 rbType = pData->fltGet();
     562           0 :         do {
     563             :         // solange den formelteil einlesen, bis das feld entweder
     564             :         // zuende ist oder der ergebnisteil beginnt. dabei koennen
     565             :         // natuerlich neue felder beginnen (word unterstuetzt felder,
     566             :         // die wiederum felder beinhalten).
     567           0 :             ++(*this);
     568           0 :             pData = GetData();
     569           0 :             if (pData->chGet()==19) // nested field
     570             :             {
     571           0 :                 Out(rOut, rMan, nDepth+1);
     572           0 :                 rMan.Fill(c);
     573             :                 OSL_ENSURE(c==21, "Ww1PlainText");
     574           0 :                 sFormel.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "Ww" ));
     575           0 :                 sFormel += OUString::number( nPlcIndex );
     576           0 :                 c = rMan.Fill(aStr, GetLength());
     577             :                 OSL_ENSURE(Ww1PlainText::IsChar(c), "Ww1PlainText");
     578           0 :                 sFormel += aStr;
     579             :             }
     580             :         }
     581           0 :         while (pData->chGet()==19);
     582             : 
     583             :         // get format out of text
     584           0 :         pos = sFormel.SearchAscii( "\\*" );
     585           0 :         sFormat = sFormel.Copy( pos );
     586           0 :         sFormel.Erase( pos );
     587             : 
     588           0 :         pos = sFormel.SearchAscii( "\\@" );
     589           0 :         sDTFormat = sFormel.Copy( pos );
     590           0 :         sFormel.Erase( pos );
     591             : 
     592             :         // der formelteil ist zuende, kommt ein ergebnisteil?
     593           0 :         if( pData->chGet() == 20 )
     594             :         {
     595           0 :             rMan.Fill( c );
     596             :             OSL_ENSURE(c==20, "Ww1PlainText");
     597           0 :             c = rMan.Fill(sErgebnis, GetLength());
     598           0 :             if (!Ww1PlainText::IsChar(c))
     599           0 :                 sErgebnis += c; //~ mdt: sonderzeichenbenhandlung
     600           0 :             ++(*this);
     601           0 :             pData = GetData();
     602             :         }
     603             :         OSL_ENSURE(pData->chGet()==21, "Ww1PlainText");
     604           0 :         bool bKnown = true;
     605             :         OSL_ENSURE(pField==0, "Ww1PlainText");
     606           0 :         if (pField != 0)
     607             :         {
     608           0 :             rOut << *pField;
     609           0 :             delete pField;
     610           0 :             pField = 0;
     611             :         }
     612             : // naja, aber info enthaelt alle moeglichkeiten, die auch direkt da sind
     613             : oncemore:
     614           0 :         switch (rbType)
     615             :         {
     616             :         case 3: // bookmark reference
     617           0 :             rOut.ConvertUStr( sFormel );
     618             :             pField = new SwGetRefField( (SwGetRefFieldType*)
     619           0 :                 rOut.GetSysFldType( RES_GETREFFLD ),
     620             :                 sFormel,
     621             :                 REF_BOOKMARK,
     622             :                 0,
     623           0 :                 REF_CONTENT );
     624             : 
     625           0 :         break;
     626             :         case 6: // set command
     627             :         {
     628           0 :             pos = aStr.Search(' ');
     629           0 :             String aName( aStr.Copy( 0, pos ));
     630           0 :             aStr.Erase(0, pos );
     631           0 :             aStr.Erase(0, 1);
     632           0 :             if( !aName.Len() )
     633           0 :                 break;
     634           0 :             rOut.ConvertUStr( aName );
     635           0 :             SwFieldType* pFT = rOut.GetDoc().InsertFldType(
     636           0 :                 SwSetExpFieldType( &rOut.GetDoc(), aName, nsSwGetSetExpType::GSE_STRING ) );
     637           0 :             pField = new SwSetExpField((SwSetExpFieldType*)pFT, aStr);
     638           0 :             ((SwSetExpField*)pField)->SetSubType( nsSwExtendedSubType::SUB_INVISIBLE );
     639             : // Invisible macht in 378 AErger, soll aber demnaechst gehen
     640             : 
     641             :             // das Ignorieren des Bookmarks ist nicht implementiert
     642             :         }
     643           0 :         break;
     644             :         case 14: // info var
     645             :         {
     646           0 :             pos = aStr.Search(' ');
     647           0 :             String aSubType( aStr.Copy( 0, pos ));
     648           0 :             aStr.Erase(0, pos );
     649           0 :             aStr.Erase(0, 1);
     650           0 :             rOut.ConvertUStr( aSubType );
     651             : 
     652             : 
     653             :             // ganz grosze schiete: der typ 'info' kann einem der
     654             :             // typen 15..31 entsprechen. er enthaelt als formel
     655             :             // das eingentliche feld der doc-info.
     656             :             // kein ';' benutzen mit folgendem macro:
     657             : #define IS(sd, se, t) \
     658             :     if (aSubType.EqualsAscii( sd ) || aSubType.EqualsAscii( se)) \
     659             :         rbType = t; \
     660             :     else
     661             : 
     662             :             // deutsche bez.     englische bez.    typ-code
     663           0 :             IS("titel",          "title",          15)
     664           0 :             IS("thema",          "subject",        16)
     665           0 :             IS("autor",          "author",         17)
     666           0 :             IS("stichw?rter",    "keywords",       18) //~ mdt: umlaut
     667           0 :             IS("kommentar",      "comment",        19)
     668           0 :             IS("gespeichertvon", "lastrevisedby",  20)
     669           0 :             IS("ertelldat",      "creationdate",   21)
     670           0 :             IS("speicherdat",    "revisiondate",   22)
     671           0 :             IS("druckdat",       "printdate",      23)
     672           0 :             IS("version",        "revisionnumber", 24)
     673           0 :             IS("zeit",           "edittime",       25)
     674           0 :             IS("anzseit",        "numberofpages",  26)
     675           0 :             IS("anzw?rter",      "numberofwords",  27) //~ mdt: umlaut
     676           0 :             IS("anzzeichen",     "numberofchars",  28)
     677           0 :             IS("dateiname",      "filename",       29)
     678           0 :             IS("vorlage",        "templatename",   30)
     679           0 :                 bKnown = false;
     680             : #undef IS
     681           0 :             if (rbType != 14)
     682           0 :                 goto oncemore;
     683             :         }
     684           0 :         break;
     685             :         case 15: // title
     686             :             pField = new SwDocInfoField((SwDocInfoFieldType*)
     687           0 :              rOut.GetSysFldType(RES_DOCINFOFLD), DI_TITEL, String(), 0);
     688           0 :         break;
     689             :         case 16: // subject
     690             :             pField = new SwDocInfoField((SwDocInfoFieldType*)
     691           0 :              rOut.GetSysFldType(RES_DOCINFOFLD), DI_THEMA, String(), 0);
     692           0 :         break;
     693             :         case 17: // author
     694             :             pField = new SwAuthorField((SwAuthorFieldType*)
     695           0 :              rOut.GetSysFldType(RES_AUTHORFLD), AF_NAME );
     696           0 :         break;
     697             :         case 18: // keywords
     698             :             pField = new SwDocInfoField((SwDocInfoFieldType*)
     699           0 :              rOut.GetSysFldType(RES_DOCINFOFLD), DI_KEYS, String(), 0);
     700           0 :         break;
     701             :         case 19: // comments
     702             :             pField = new SwDocInfoField((SwDocInfoFieldType*)
     703           0 :              rOut.GetSysFldType(RES_DOCINFOFLD), DI_COMMENT, String(), 0);
     704           0 :         break;
     705             :         case 20: // last revised by
     706             :             pField = new SwDocInfoField((SwDocInfoFieldType*)
     707           0 :              rOut.GetSysFldType(RES_DOCINFOFLD), DI_CHANGE|DI_SUB_AUTHOR, String());
     708           0 :         break;
     709             :         case 21: // creation date
     710             :         case 22: // revision date
     711             :         case 23: // print date
     712             :         case 25:{// edit time
     713             :                     sal_uInt16 nSub;
     714           0 :                     sal_uInt16 nReg = 0;    // RegInfoFormat, DefaultFormat fuer DocInfoFelder
     715             : 
     716           0 :                     switch( rbType )
     717             :                     {
     718             :                         default:
     719           0 :                         case 21: nSub = DI_CREATE;  nReg = DI_SUB_DATE; break;
     720           0 :                         case 23: nSub = DI_PRINT;   nReg = DI_SUB_DATE; break;
     721           0 :                         case 22: nSub = DI_CHANGE;  nReg = DI_SUB_DATE; break;
     722           0 :                         case 25: nSub = DI_CHANGE;  nReg = DI_SUB_TIME; break;
     723             :                     }
     724           0 :                     switch( GetTimeDatePara( sDTFormat ) )
     725             :                     {
     726           0 :                         case WW_DATE: nReg = DI_SUB_DATE; break;
     727           0 :                         case WW_TIME: nReg = DI_SUB_TIME; break;
     728           0 :                         case WW_BOTH: nReg = DI_SUB_DATE; break;
     729             :                         default:
     730           0 :                             break;
     731             :                         // WW_DONTKNOW -> Default bereits gesetzt
     732             :                     }
     733             :                     pField = new SwDocInfoField((SwDocInfoFieldType*)
     734           0 :                         rOut.GetSysFldType(RES_DOCINFOFLD), nSub | nReg, String());
     735             :                 }
     736           0 :         break;
     737             :         case 24: // revision number
     738             :             pField = new SwDocInfoField((SwDocInfoFieldType*)
     739           0 :              rOut.GetSysFldType(RES_DOCINFOFLD),  DI_DOCNO, String(), 0);
     740           0 :         break;
     741             :         case 26: // number of pages
     742             :             pField = new SwDocStatField((SwDocStatFieldType*)
     743           0 :              rOut.GetSysFldType(RES_DOCSTATFLD), DS_PAGE, SVX_NUM_ARABIC);
     744           0 :         break;
     745             :         case 27: // number of words
     746             :             pField = new SwDocStatField((SwDocStatFieldType*)
     747           0 :              rOut.GetSysFldType(RES_DOCSTATFLD), DS_WORD, SVX_NUM_ARABIC);
     748           0 :         break;
     749             :         case 28: // number of chars
     750             :             pField = new SwDocStatField((SwDocStatFieldType*)
     751           0 :              rOut.GetSysFldType(RES_DOCSTATFLD), DS_CHAR, SVX_NUM_ARABIC);
     752           0 :         break;
     753             :         case 29: // file name
     754             :             pField = new SwFileNameField((SwFileNameFieldType*)
     755           0 :              rOut.GetSysFldType(RES_FILENAMEFLD));
     756           0 :         break;
     757             :         case 30: // doc template name
     758             :             pField = new SwTemplNameField((SwTemplNameFieldType*)
     759           0 :              rOut.GetSysFldType(RES_TEMPLNAMEFLD), FF_NAME);
     760           0 :         break;
     761             :         case 31:
     762             :         case 32:{
     763           0 :                     SwDateFormat aDate = DF_SSYS;
     764           0 :                     SwTimeFormat aTime = TF_SYSTEM;
     765             : 
     766           0 :                     WWDateTime eDT = GetTimeDatePara(sDTFormat, &aTime, &aDate);
     767           0 :                     if( eDT == WW_DONTKNOW )        // kein D/T-Formatstring
     768           0 :                         eDT = ( rbType == 32 ) ? WW_TIME : WW_DATE;    // benutze ID
     769             : 
     770           0 :                     if( eDT & WW_DATE )
     771             :                     {
     772           0 :                         sal_uInt16 nWhich = RES_DATEFLD;
     773           0 :                         sal_uInt16 nSubType = DATEFLD;
     774           0 :                         sal_uLong nFormat = aDate;
     775           0 :                         sw3io_ConvertFromOldField( rOut.GetDoc(),
     776           0 :                             nWhich, nSubType, nFormat, 0x0110 );
     777             :                         pField = new SwDateTimeField((SwDateTimeFieldType*)
     778           0 :                             rOut.GetSysFldType(RES_DATETIMEFLD), DATEFLD, nFormat);
     779             : 
     780           0 :                         if( eDT == WW_BOTH )
     781           0 :                             rOut << * pField << ' ';
     782             :                                 // Mogel: direkt einfuegen und Space dahinter
     783             :                     }
     784           0 :                     if( eDT & WW_TIME )
     785             :                     {
     786           0 :                         sal_uInt16 nWhich = RES_TIMEFLD;
     787           0 :                         sal_uInt16 nSubType = TIMEFLD;
     788           0 :                         sal_uLong nFormat = aTime;
     789           0 :                         sw3io_ConvertFromOldField( rOut.GetDoc(),
     790           0 :                             nWhich, nSubType, nFormat, 0x0110 );
     791             :                         pField = new SwDateTimeField((SwDateTimeFieldType*)
     792           0 :                             rOut.GetSysFldType(RES_DATETIMEFLD), TIMEFLD, nFormat);
     793             :                     }
     794             : 
     795             :                 }
     796           0 :         break;
     797             :         case 33: // current page
     798             :             pField = new SwPageNumberField((SwPageNumberFieldType*)
     799           0 :              rOut.GetSysFldType(RES_PAGENUMBERFLD), PG_RANDOM, SVX_NUM_ARABIC);
     800           0 :         break;
     801             :         case 34: // evaluation exp
     802             :         {
     803           0 :             if (nDepth == 0)
     804             :             {
     805             :                 SwGetExpFieldType* pFieldType =
     806           0 :                  (SwGetExpFieldType*)rOut.GetSysFldType(RES_GETEXPFLD);
     807             :                 OSL_ENSURE(pFieldType!=0, "Ww1Fields");
     808           0 :                 if (pFieldType != 0)
     809             :                     pField = new SwGetExpField(pFieldType, sFormel,
     810           0 :                      nsSwGetSetExpType::GSE_STRING, VVF_SYS);
     811             :             }
     812             :             else // rekursion:
     813             :             {
     814           0 :                 OUString aName("Ww");
     815           0 :                 aName += OUString::number( nPlcIndex );
     816           0 :                 SwFieldType* pFT = rOut.GetDoc().GetFldType( RES_SETEXPFLD, aName, false);
     817           0 :                 if (pFT == 0)
     818             :                 {
     819           0 :                     SwSetExpFieldType aS(&rOut.GetDoc(), aName, nsSwGetSetExpType::GSE_FORMULA);
     820           0 :                     pFT = rOut.GetDoc().InsertFldType(aS);
     821             :                 }
     822           0 :                 SwSetExpField aFld((SwSetExpFieldType*)pFT, sFormel);
     823           0 :                 aFld.SetSubType(nsSwExtendedSubType::SUB_INVISIBLE);
     824           0 :                 rOut << aFld;
     825             :             }
     826             :         }
     827           0 :         break;
     828             :         case 36: // print command, Einfuegendatei
     829             :         {
     830           0 :             pos = aStr.Search(' ');
     831           0 :             String aFName( aStr.Copy( 0, pos ));
     832           0 :             aStr.Erase(0, pos );
     833           0 :             aStr.Erase(0, 1);
     834           0 :             if( !aFName.Len() )
     835           0 :                 break;
     836           0 :             aFName.SearchAndReplaceAscii( "\\\\", OUString('\\') );
     837             : 
     838           0 :             aFName = URIHelper::SmartRel2Abs(
     839           0 :                 INetURLObject(rOut.GetBaseURL()), aFName );
     840             : 
     841             :             SwSectionData * pSection = new SwSectionData( FILE_LINK_SECTION,
     842           0 :                 rOut.GetDoc().GetUniqueSectionName( &aStr ) );
     843           0 :             pSection->SetLinkFileName( aFName );
     844           0 :             pSection->SetProtectFlag( true );
     845           0 :             rOut << SwFltSection( pSection );
     846           0 :             rOut.EndItem( RES_FLTR_SECTION );
     847           0 :             rOut.NextParagraph();
     848             :         }
     849             :         case 37: // page ref
     850             :             pField = new SwGetRefField(
     851           0 :              (SwGetRefFieldType*)rOut.GetSysFldType(RES_GETREFFLD),
     852           0 :              sFormel, 0, 0, REF_PAGE);
     853           0 :         break;
     854             :         case 38: // ask command
     855             :         {
     856           0 :             pos = aStr.Search(' ');
     857           0 :             String aName( aStr.Copy( 0, pos ));
     858           0 :             aStr.Erase(0, pos );
     859           0 :             aStr.Erase(0, 1);
     860           0 :             if( !aName.Len() )
     861           0 :                 break;
     862             : 
     863           0 :             SwFieldType* pFT = rOut.GetDoc().InsertFldType(
     864           0 :                 SwSetExpFieldType( &rOut.GetDoc(), aName, nsSwGetSetExpType::GSE_STRING ) );
     865           0 :             pField = new SwSetExpField((SwSetExpFieldType*)pFT, aStr );
     866           0 :             ((SwSetExpField*)pField)->SetInputFlag( sal_True );
     867           0 :             ((SwSetExpField*)pField)->SetSubType(nsSwExtendedSubType::SUB_INVISIBLE);
     868             :         }
     869             :         case 39: // fillin command
     870             :             pField = new SwInputField(
     871           0 :                 (SwInputFieldType*)rOut.GetSysFldType( RES_INPUTFLD ),
     872             :                 aEmptyStr, sFormel,
     873           0 :                 INP_TXT, 0 );       // sichtbar ( geht z.Zt. nicht anders )
     874           0 :         break;
     875             :         case 51: // macro button
     876             :         {
     877           0 :             pos = aStr.Search(' ');
     878           0 :             String aName( aStr.Copy( 0, pos ));
     879           0 :             aStr.Erase(0, pos );
     880           0 :             aStr.Erase(0, 1);
     881           0 :             if( !aName.Len() || !aStr.Len() )
     882           0 :                 break;
     883           0 :             aName.InsertAscii( "StarOffice.Standard.Modul1.", 0 );
     884             : 
     885             :             pField = new SwMacroField( (SwMacroFieldType*)
     886           0 :                             rOut.GetSysFldType( RES_MACROFLD ),
     887           0 :                             aName, aStr );
     888             :         }
     889           0 :         break;
     890             :         case 55: // read tiff / or better: import anything
     891             :         {
     892           0 :             const sal_Unicode* pFormel = sFormel.GetBuffer();
     893           0 :             const sal_Unicode* pDot = 0;
     894           0 :             String sName;
     895           0 :             while (*pFormel != '\0' && *pFormel != ' ')
     896             :             {
     897             :                 // ab hier koennte eine extension kommen
     898           0 :                 if (*pFormel == '.')
     899           0 :                     pDot = pFormel;
     900             :                 else
     901             :                     // aha: wir waren bislang noch in dirs
     902           0 :                     if (*pFormel == '\\')
     903             :                     {
     904           0 :                         pDot = 0;
     905           0 :                         if (pFormel[1] == '\\')
     906           0 :                             pFormel++;
     907             :                     }
     908           0 :                 if (*pFormel != '\0')
     909           0 :                     sName += *pFormel++;
     910             :             }
     911           0 :             if( pDot )
     912             :             {
     913           0 :                 String sExt;
     914           0 :                 while( *pDot != '\0' && *pDot != ' ')
     915           0 :                     sExt += *pDot++;
     916             : 
     917           0 :                 if( sExt.EqualsIgnoreCaseAscii( ".tiff" )
     918           0 :                  || sExt.EqualsIgnoreCaseAscii( ".bmp" )
     919           0 :                  || sExt.EqualsIgnoreCaseAscii( ".gif" )
     920           0 :                  || sExt.EqualsIgnoreCaseAscii( ".pcx" )
     921           0 :                  || sExt.EqualsIgnoreCaseAscii( ".pic" ))
     922           0 :                     rOut.AddGraphic( sName );
     923             :                 else
     924           0 :                     bKnown = false;
     925             :             }
     926             :             else
     927           0 :                 bKnown = false;
     928             :         }
     929           0 :         break;
     930             :         default: // unknown
     931             :             OSL_ENSURE(false, "Ww1PlainText");
     932             :         // unsupported:
     933             :         case 1: // unknown
     934             :         case 2: // possible bookmark
     935             :         case 4: // index entry
     936             :         // wwpar5: 1351/1454
     937             :         case 5: // footnote ref
     938             :         case 7: // if command
     939             :         case 8: // create index
     940             :         // wwpar5: 1351/1454
     941             :         case 9: // table of contents entry
     942             :         // wwpar5: 1351/1454
     943             :         case 10: // style ref
     944             :         case 11: // doc ref
     945             :         case 12: // seq ref
     946             :         case 13: // create table of contents
     947             :         // wwpar5: 1351/1454
     948             :         case 35: // literal text
     949             :         // print merge:
     950             :         case 40: // data command
     951             :         case 41: // next command
     952             :         case 42: // nextif command
     953             :         case 43: // skipif command
     954             :         case 44: // number of record
     955             :         //
     956             :         case 45: // dde ref
     957             :         case 46: // dde auto ref
     958             :         case 47: // glossary entry
     959             :         case 48: // print char
     960             :         case 49: // formula def
     961             :         case 50: // goto button
     962             :         case 52: // auto number outline
     963             :         case 53: // auto number legal
     964             :         case 54: // auto number arabic
     965           0 :             bKnown = false;
     966           0 :         break;
     967             :         }
     968           0 :         if( bKnown || sErgebnis.EqualsAscii( "\270" ))
     969           0 :             this->sErgebnis.Erase();
     970             :         else
     971           0 :             this->sErgebnis = sErgebnis;
     972             :     }
     973             :     else // oops: we are terribly wrong: skip this
     974           0 :         ++(*this);
     975           0 : }
     976             : 
     977           0 : sal_uLong Ww1Fields::GetLength()
     978             : {
     979             : // berechnet die laenge eines feldteiles. nicht mitgerechnet werden
     980             : // die terminierenden zeichen im text (19, 20, 21) die beginn, trenner
     981             : // und ende bedeuten.
     982           0 :     sal_uLong ulBeg = Where();
     983           0 :     sal_uLong ulEnd = Where(nPlcIndex+1);
     984             :     OSL_ENSURE(ulBeg<ulEnd, "Ww1Fields");
     985           0 :     return (ulEnd - ulBeg) - 1;
     986             : }
     987             : 
     988             : /////////////////////////////////////////////////////////////////// Sep
     989           0 : void Ww1Sep::Start(Ww1Shell& rOut, Ww1Manager& rMan)
     990             : {
     991           0 :     if (rMan.Where() >= Where())
     992             :     {
     993           0 :         rOut.NextSection();
     994           0 :         SwFrmFmt &rFmt = rOut.GetPageDesc().GetMaster();
     995           0 :         W1_DOP& rDOP = rMan.GetDop().GetDOP();
     996           0 :         rOut.GetPageDesc().SetLandscape(rDOP.fWideGet());
     997           0 :         SwFmtFrmSize aSz(rFmt.GetFrmSize());
     998           0 :         aSz.SetWidth(rDOP.xaPageGet());
     999           0 :         aSz.SetHeight(rDOP.yaPageGet());
    1000           0 :         rFmt.SetFmtAttr(aSz);
    1001           0 :         SvxLRSpaceItem aLR(rDOP.dxaLeftGet()+rDOP.dxaGutterGet(),
    1002           0 :          rDOP.dxaRightGet(), 0, 0, RES_LR_SPACE);
    1003           0 :         rFmt.SetFmtAttr(aLR);
    1004           0 :         SvxULSpaceItem aUL(rDOP.dyaTopGet(), rDOP.dyaBottomGet(), RES_UL_SPACE);
    1005           0 :         rFmt.SetFmtAttr(aUL);
    1006             :     // sobald wir mit dem lesen der zeichen soweit sind, wo sep's
    1007             :     // momentanes attribut beginnt, wird dieses attribut eingefuegt.
    1008             :     // diese methode ist bei den meisten start/stop methoden der
    1009             :     // memberklassen des managers identisch.
    1010           0 :         sal_uInt8* pByte = GetData();
    1011           0 :         Ww1SprmSep aSprm(rFib, SVBT32ToUInt32(pByte + 2));
    1012           0 :         aSprm.Start(rOut, rMan);
    1013           0 :         aSprm.Stop(rOut, rMan);
    1014           0 :         ++(*this);
    1015           0 :         aHdd.Start(rOut, rMan);
    1016             :     }
    1017           0 : }
    1018             : 
    1019             : /////////////////////////////////////////////////////////////////// Pap
    1020           0 : void Ww1Pap::Start(Ww1Shell& rOut, Ww1Manager& rMan)
    1021             : {
    1022           0 :     if (rMan.Where() >= Where())
    1023             :     {
    1024             :         sal_uInt8* pByte;
    1025             :         sal_uInt16 cb;
    1026             :     // bereitstellen der zu startenden attribute
    1027           0 :         if (FillStart(pByte, cb))
    1028             :         {
    1029           0 :             Ww1SprmPapx aSprm(pByte, cb);
    1030             :         // und ausgeben:
    1031           0 :             aSprm.Start(rOut, rMan);
    1032             :         }
    1033           0 :         ++(*this);
    1034             :     }
    1035           0 : }
    1036             : 
    1037           0 : void Ww1Pap::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode&)
    1038             : {
    1039           0 :     if (rMan.Where() >= Where() || rMan.IsStopAll())
    1040             :     {
    1041             :         sal_uInt8* pByte;
    1042             :         sal_uInt16 cb;
    1043           0 :         if (FillStop(pByte, cb)){
    1044           0 :             Ww1SprmPapx aSprm(pByte, cb);
    1045           0 :             aSprm.Stop(rOut, rMan);
    1046             :         }else{
    1047             :             OSL_ENSURE( !nPlcIndex || rMan.IsStopAll(), "Pap-Attribut-Stop verloren" );
    1048             :         }
    1049             :     }
    1050           0 : }
    1051             : 
    1052             : //////////////////////////////////////////////////////////////// W1_CHP
    1053             : //
    1054             : // momentan laesst sich die ausgabe von W1CHPxen nicht nur per define
    1055             : // loesen....
    1056             : //
    1057           0 : void W1_CHP::Out(Ww1Shell& rOut, Ww1Manager& rMan)
    1058             : {
    1059           0 :     if (fBoldGet())
    1060             :         rOut << SvxWeightItem(
    1061           0 :             rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD, RES_CHRATR_WEIGHT);
    1062           0 :     if (fItalicGet())
    1063             :         rOut << SvxPostureItem(
    1064           0 :             rOut.GetPostureItalic()?ITALIC_NONE:ITALIC_NORMAL, RES_CHRATR_POSTURE);
    1065           0 :     if (fStrikeGet())
    1066             :         rOut << SvxCrossedOutItem(
    1067           0 :             rOut.GetCrossedOut()?STRIKEOUT_NONE:STRIKEOUT_SINGLE, RES_CHRATR_CROSSEDOUT);
    1068           0 :     if (fOutlineGet())
    1069           0 :         rOut << SvxContourItem(!rOut.GetContour(), RES_CHRATR_CONTOUR);
    1070           0 :     if (fSmallCapsGet())
    1071             :         rOut << SvxCaseMapItem(
    1072           0 :             rOut.GetCaseKapitaelchen()?SVX_CASEMAP_NOT_MAPPED:SVX_CASEMAP_KAPITAELCHEN, RES_CHRATR_CASEMAP);
    1073           0 :     if (fCapsGet())
    1074             :         rOut << SvxCaseMapItem(
    1075           0 :             rOut.GetCaseVersalien()?SVX_CASEMAP_NOT_MAPPED:SVX_CASEMAP_VERSALIEN, RES_CHRATR_CASEMAP);
    1076           0 :     if (fsHpsGet())
    1077           0 :             rOut << SvxFontHeightItem(hpsGet() * 10, 100, RES_CHRATR_FONTSIZE);
    1078           0 :     if (fsKulGet())
    1079           0 :         switch (kulGet()) {
    1080             :         case 0: {
    1081           0 :                     rOut << SvxUnderlineItem(UNDERLINE_NONE, RES_CHRATR_UNDERLINE) <<
    1082           0 :                         SvxWordLineModeItem(sal_False, RES_CHRATR_WORDLINEMODE);
    1083           0 :                 } break;
    1084             :         default: OSL_ENSURE(false, "Chpx");
    1085             :         case 1: {
    1086           0 :                     rOut << SvxUnderlineItem(UNDERLINE_SINGLE, RES_CHRATR_UNDERLINE);
    1087           0 :                 } break;
    1088             :         case 2: {
    1089           0 :                     rOut << SvxUnderlineItem(UNDERLINE_SINGLE, RES_CHRATR_UNDERLINE) <<
    1090           0 :                     SvxWordLineModeItem(sal_True, RES_CHRATR_WORDLINEMODE);
    1091           0 :                 } break;
    1092             :         case 3: {
    1093           0 :                     rOut << SvxUnderlineItem(UNDERLINE_DOUBLE, RES_CHRATR_UNDERLINE);
    1094           0 :                 } break;
    1095             :         case 4: {
    1096           0 :                     rOut << SvxUnderlineItem(UNDERLINE_DOTTED, RES_CHRATR_UNDERLINE);
    1097           0 :                 } break;
    1098             :         }
    1099             : 
    1100           0 :     if (fsIcoGet())
    1101           0 :         switch(icoGet()) {
    1102             :         default: OSL_ENSURE(false, "Chpx");
    1103           0 :         case 0: { rOut.EndItem(RES_CHRATR_COLOR); } break;
    1104           0 :         case 1: { rOut << SvxColorItem(Color(COL_BLACK), RES_CHRATR_COLOR); } break;
    1105           0 :         case 2: { rOut << SvxColorItem(Color(COL_LIGHTBLUE), RES_CHRATR_COLOR); } break;
    1106           0 :         case 3: { rOut << SvxColorItem(Color(COL_LIGHTCYAN), RES_CHRATR_COLOR); } break;
    1107           0 :         case 4: { rOut << SvxColorItem(Color(COL_LIGHTGREEN), RES_CHRATR_COLOR); } break;
    1108           0 :         case 5: { rOut << SvxColorItem(Color(COL_LIGHTMAGENTA), RES_CHRATR_COLOR); } break;
    1109           0 :         case 6: { rOut << SvxColorItem(Color(COL_LIGHTRED), RES_CHRATR_COLOR); } break;
    1110           0 :         case 7: { rOut << SvxColorItem(Color(COL_YELLOW), RES_CHRATR_COLOR); } break;
    1111           0 :         case 8: { rOut << SvxColorItem(Color(COL_WHITE), RES_CHRATR_COLOR); } break;
    1112             :         }
    1113           0 :     if (fsSpaceGet()) {
    1114           0 :         short sQps = qpsSpaceGet();
    1115           0 :         if (sQps > 56)
    1116           0 :             sQps = sQps - 64;
    1117           0 :         rOut << SvxKerningItem(sQps, RES_CHRATR_KERNING);
    1118             :     }
    1119           0 :     if (fsPosGet()) {
    1120           0 :         if (hpsPosGet() == 0)
    1121           0 :             rOut << SvxEscapementItem(SVX_ESCAPEMENT_OFF, 100, RES_CHRATR_ESCAPEMENT);
    1122             :         else {
    1123           0 :             short sHps = hpsPosGet();
    1124           0 :             if (sHps > 128)
    1125           0 :                 sHps =  sHps - 256;
    1126           0 :             sHps *= 100;
    1127           0 :             sHps /= 24;
    1128           0 :             rOut << SvxEscapementItem(sHps, 100, RES_CHRATR_ESCAPEMENT);
    1129             :         }
    1130             :     }
    1131           0 :     if (fsFtcGet()) {
    1132           0 :         SvxFontItem aFont(rMan.GetFont(ftcGet()));
    1133           0 :         rOut << aFont;
    1134             :     }
    1135           0 : }
    1136             : 
    1137             : /////////////////////////////////////////////////////////////////// Chp
    1138           0 : void Ww1Chp::Start(Ww1Shell& rOut, Ww1Manager& rMan)
    1139             : {
    1140           0 :     if (rMan.Where() >= Where())
    1141             :     {
    1142           0 :         W1_CHP aChpx;
    1143           0 :         if (FillStart(aChpx))
    1144             :         {
    1145           0 :             aChpx.Out(rOut, rMan);
    1146           0 :             if (aChpx.fcPicGet())
    1147             :             {
    1148           0 :                 Ww1Picture aPic(rMan.GetFib().GetStream(),
    1149           0 :                  aChpx.fcPicGet());
    1150           0 :                 if (!aPic.GetError())
    1151           0 :                     aPic.Out(rOut, rMan);
    1152             :             }
    1153             :         }
    1154           0 :         ++(*this);
    1155             :     }
    1156           0 : }
    1157             : 
    1158           0 : void Ww1Chp::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode&)
    1159             : {
    1160           0 :     if (rMan.Where() >= Where())
    1161             :     {
    1162           0 :         W1_CHP aChpx;
    1163           0 :         if (FillStop(aChpx))
    1164             :         {
    1165             :         // zuerst alle toggle-flags
    1166           0 :             if (aChpx.fBoldGet())
    1167           0 :                 rOut.EndItem(RES_CHRATR_WEIGHT);
    1168           0 :             if (aChpx.fItalicGet())
    1169           0 :                 rOut.EndItem(RES_CHRATR_POSTURE);
    1170           0 :             if (aChpx.fStrikeGet())
    1171           0 :                 rOut.EndItem(RES_CHRATR_CROSSEDOUT);
    1172           0 :             if (aChpx.fOutlineGet())
    1173           0 :                 rOut.EndItem(RES_CHRATR_CONTOUR);
    1174           0 :             if (aChpx.fSmallCapsGet() || aChpx.fCapsGet())
    1175           0 :                 rOut.EndItem(RES_CHRATR_CASEMAP);
    1176             :         // dann alle zahl-werte, diese haben flags, wenn sie gesetzt
    1177             :         // sind..................
    1178           0 :             if (aChpx.fsHpsGet())
    1179           0 :                 rOut.EndItem(RES_CHRATR_FONTSIZE);
    1180           0 :             if (aChpx.fsKulGet())
    1181           0 :                 rOut.EndItem(RES_CHRATR_UNDERLINE)
    1182           0 :                     .EndItem(RES_CHRATR_WORDLINEMODE);
    1183           0 :             if (aChpx.fsIcoGet())
    1184           0 :                 rOut.EndItem(RES_CHRATR_COLOR);
    1185           0 :             if (aChpx.fsSpaceGet())
    1186           0 :                 rOut.EndItem(RES_CHRATR_KERNING);
    1187           0 :             if (aChpx.fsPosGet())
    1188           0 :                 rOut.EndItem(RES_CHRATR_ESCAPEMENT);
    1189           0 :             if (aChpx.fsFtcGet())
    1190           0 :                 rOut.EndItem(RES_CHRATR_FONT);
    1191             :         }else{
    1192             :             OSL_ENSURE( !nPlcIndex, "Chp-Attribut-Stop verloren" );
    1193             :         }
    1194             :     }
    1195           0 : }
    1196             : 
    1197             : ///////////////////////////////////////////////////////////////// Style
    1198           0 : void Ww1Style::Out(Ww1Shell& rOut, Ww1Manager& rMan)
    1199             : {
    1200             : // Zuerst Basis, damit Attribute des Basis-Styles erkannt werden
    1201             : // first: Base................................................
    1202           0 :     if(pParent->GetStyle(stcBase).IsUsed() )    // Basis gueltig ?
    1203           0 :         rOut.BaseStyle(stcBase);
    1204             : 
    1205             : // next of all: CHP...............................................
    1206           0 :     aChpx.Out(rOut, rMan);
    1207             : // Last: PAP.......................................................
    1208           0 :     if (pPapx)
    1209           0 :         pPapx->Start(rOut, rMan);
    1210           0 : }
    1211             : 
    1212             : ////////////////////////////////////////////////////////// Ww1PlainText
    1213             : //
    1214             : // die Out() methoden von plaintext fuer den filter geben eine anzahl
    1215             : // zeichen aus auf die shell, einen string oder einen char, wieviel
    1216             : // zeichen ausgegeben werden, bestimmt ulEnd, das das ende bestimmt,
    1217             : // bis zudem ausgegeben wird. ausserdem beenden die methoden die
    1218             : // ausgabe bei kontrollzeichen.
    1219             : // diese sind definiert durch MinChar. alle zeichen mit wert darunter
    1220             : // gelten als kontroll- zeichen. dafuer gibts die methode IsChar, die
    1221             : // zurueckgibt, ob es sich um ein standard zeichen handelt. kommt ein
    1222             : // solches zeichen, wird dieses zeichen zurueckgegeben und die methode
    1223             : // beendet, auch wenn ulEnd noch nicht erreicht wurde. bei nutzung
    1224             : // also beachten, dasz wenn !IsChar(Out(...)) gilt, ulEnd unter
    1225             : // umstaenden nicht erreicht wurde. dann wurde das kontrollzeichen
    1226             : // zwar (weg-)gelesen, jedoch noch nicht ausgegeben.
    1227             : //
    1228           0 : sal_Unicode Ww1PlainText::Out( Ww1Shell& rOut, sal_uLong& ulEnd )
    1229             : {
    1230             : // gibt die zeichen bis ulEnd aus, es sei den es kommen sonderzeichen
    1231             : // die eine bedeutung haben wie absatzende oder seitenumbruch.
    1232           0 :     if (ulEnd > Count())
    1233           0 :         ulEnd = Count();
    1234           0 :     while (ulSeek < ulEnd)
    1235             :     {
    1236           0 :         sal_Unicode c = (*this)[ulSeek];
    1237           0 :         ++(*this);
    1238           0 :         if (Ww1PlainText::IsChar(c))
    1239           0 :             rOut << c;
    1240             :         else
    1241           0 :             return c;
    1242             :     }
    1243           0 :     return Ww1PlainText::MinChar;
    1244             : }
    1245             : 
    1246           0 : sal_Unicode Ww1PlainText::Out( String& rStr, sal_uLong ulEnd )
    1247             : {
    1248             : // wie Out(Shell..., jedoch ausgabe auf einen string
    1249           0 :     rStr.Erase();
    1250           0 :     if (ulEnd > Count())
    1251           0 :         ulEnd = Count();
    1252           0 :     while (ulSeek < ulEnd)
    1253             :     {
    1254           0 :         sal_Unicode c = (*this)[ulSeek];
    1255           0 :         ++(*this);
    1256           0 :         if( Ww1PlainText::IsChar(c) )
    1257           0 :             rStr += c;
    1258             :         else
    1259           0 :             return c;
    1260             :     }
    1261           0 :     return Ww1PlainText::MinChar;
    1262             : }
    1263             : 
    1264             : //
    1265             : // hier eruebrigt sich ulEnd...oder?
    1266             : //
    1267           0 : sal_Unicode Ww1PlainText::Out( sal_Unicode& rRead )
    1268             : {
    1269           0 :     rRead = (*this)[ulSeek];
    1270           0 :     ++(*this);
    1271           0 :     return rRead;
    1272             : }
    1273             : 
    1274             : /////////////////////////////////////////////////////////// Ww1SprmPapx
    1275             : 
    1276           0 : void Ww1SprmPapx::Start(Ww1Shell& rOut, Ww1Manager& rMan)
    1277             : {
    1278           0 :     if( !rMan.IsInStyle() ){        // Innerhalb Style gehts ueber die
    1279             :                                     // normalen Attribute
    1280           0 :         if (!rOut.IsInFly()
    1281           0 :             && !rOut.IsInTable()    // Nicht innerhalb Tabelle!
    1282           0 :             && ( rMan.HasPPc() || rMan.HasPDxaAbs())){ // Fly-Start
    1283           0 :             rOut.BeginFly();        // eAnchor );
    1284             :         }
    1285           0 :         if (!rOut.IsInTable() && rMan.HasInTable())
    1286             :         {
    1287           0 :             rOut.BeginTable();
    1288             :         }
    1289           0 :         rOut.SetStyle(aPapx.stcGet());
    1290             :     }
    1291           0 :     Ww1Sprm::Start(rOut, rMan);
    1292           0 : }
    1293             : 
    1294           0 : void Ww1SprmPapx::Stop(Ww1Shell& rOut, Ww1Manager& rMan)
    1295             : {
    1296           0 :     Ww1Sprm::Stop(rOut, rMan);
    1297             : 
    1298           0 :     if( !rMan.IsInStyle() )         // Innerhalb Style gehts ueber die
    1299             :     {                               // normalen Attribute
    1300           0 :         if (rOut.IsInTable() &&( rMan.IsStopAll() || !rMan.HasInTable()))
    1301           0 :             rOut.EndTable();
    1302             : 
    1303           0 :         if( rOut.IsInFly() &&
    1304           0 :             ( rMan.IsStopAll()
    1305           0 :                 || ( !rMan.HasPPc() && !rMan.HasPDxaAbs()   // Fly-Ende
    1306           0 :                     && !rOut.IsInTable())))     // Nicht innerhalb Tabelle!
    1307           0 :             rOut.EndFly();
    1308             :     }
    1309           0 : }
    1310             : 
    1311             : ///////////////////////////////////////////////////////////////// Fonts
    1312           0 : SvxFontItem Ww1Fonts::GetFont(sal_uInt16 nFCode)
    1313             : {
    1314             : // erzeugen eine fonts im sw-sinne aus den word-strukturen
    1315           0 :     FontFamily eFamily = FAMILY_DONTKNOW;
    1316           0 :     String aName;
    1317           0 :     FontPitch ePitch = PITCH_DONTKNOW;
    1318           0 :     rtl_TextEncoding eCharSet = RTL_TEXTENCODING_DONTKNOW;
    1319           0 :     switch (nFCode)
    1320             :     {
    1321             : // In the Winword 1.x format, the names of the first three fonts were
    1322             : // omitted from the table and assumed to be "Tms Rmn" (for ftc = 0),
    1323             : // "Symbol", and "Helv"
    1324             :     case 0:
    1325           0 :          eFamily = FAMILY_ROMAN;
    1326           0 :          aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Tms Rmn" ));
    1327           0 :          ePitch = PITCH_VARIABLE;
    1328           0 :          eCharSet = RTL_TEXTENCODING_MS_1252;
    1329           0 :     break;
    1330             :     case 1:
    1331           0 :          aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Symbol" ));
    1332           0 :          ePitch = PITCH_VARIABLE;
    1333           0 :          eCharSet = RTL_TEXTENCODING_SYMBOL;
    1334           0 :     break;
    1335             :     case 2:
    1336           0 :          eFamily = FAMILY_SWISS;
    1337           0 :          aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helv" ));
    1338           0 :          ePitch = PITCH_VARIABLE;
    1339           0 :          eCharSet = RTL_TEXTENCODING_MS_1252;
    1340           0 :     break;
    1341             :     default:
    1342             :     {
    1343           0 :         W1_FFN* pF = GetFFN(nFCode - 3);
    1344           0 :         if (pF != 0)
    1345             :         {
    1346             :         // Fontname .........................................
    1347           0 :             aName = String( (sal_Char*)pF->szFfnGet(),
    1348           0 :                             RTL_TEXTENCODING_MS_1252 );
    1349             :         // Pitch .............................................
    1350             :             static FontPitch ePitchA[] =
    1351             :             {
    1352             :                 PITCH_DONTKNOW, PITCH_FIXED, PITCH_VARIABLE, PITCH_DONTKNOW
    1353             :             };
    1354           0 :             ePitch = ePitchA[pF->prgGet()];
    1355             :         // CharSet ...........................................
    1356           0 :             eCharSet = RTL_TEXTENCODING_MS_1252;
    1357           0 :             if (aName.EqualsIgnoreCaseAscii("Symbol")
    1358           0 :              || aName.EqualsIgnoreCaseAscii("Symbol Set")
    1359           0 :              || aName.EqualsIgnoreCaseAscii("Wingdings")
    1360           0 :              || aName.EqualsIgnoreCaseAscii("ITC Zapf Dingbats") )
    1361           0 :                 eCharSet = RTL_TEXTENCODING_SYMBOL;
    1362             :         // FontFamily ........................................
    1363           0 :             sal_uInt16 b = pF->ffGet();
    1364             :             static FontFamily eFamilyA[] =
    1365             :             {
    1366             :                 FAMILY_DONTKNOW, FAMILY_ROMAN, FAMILY_SWISS, FAMILY_MODERN,
    1367             :                 FAMILY_SCRIPT, FAMILY_DECORATIVE
    1368             :             };
    1369           0 :             if (b < (sizeof(eFamilyA)/sizeof(eFamilyA[0])))
    1370           0 :                 eFamily = eFamilyA[b];
    1371             :         }
    1372             :         else
    1373             :         {
    1374             :             OSL_ENSURE(false, "WW1Fonts::GetFont: Nicht existenter Font !");
    1375           0 :             eFamily = FAMILY_SWISS;
    1376           0 :              aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helv" ));
    1377           0 :             ePitch = PITCH_VARIABLE;
    1378           0 :             eCharSet = RTL_TEXTENCODING_MS_1252;
    1379             :         }
    1380             :     }
    1381           0 :     break;
    1382             :     }
    1383             :             // Extrawurst Hypo
    1384           0 :     if ( SwFltGetFlag( nFieldFlags, SwFltControlStack::HYPO )
    1385           0 :          && ( aName.EqualsIgnoreCaseAscii("Helv")
    1386           0 :             || aName.EqualsIgnoreCaseAscii("Helvetica") ) )
    1387             :     {
    1388           0 :          aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica Neue" ));
    1389           0 :         if (eFamily==FAMILY_DONTKNOW)
    1390           0 :             eFamily = FAMILY_SWISS;
    1391             :     }
    1392             :     else
    1393             :     {
    1394             :             // VCL matcht die Fonts selber
    1395             :             // allerdings passiert bei Helv, Tms Rmn und System Monospaced
    1396             :             // Scheisse, so dass diese ersetzt werden muessen.
    1397             :             // Nach TH sollen diese durch feste Werte ersetzt werden,
    1398             :             // also nicht ueber System::GetStandardFont, damit keine
    1399             :             // Namenslisten auftauchen ( Dieses koennte den User verwirren )
    1400           0 :         if( aName.EqualsIgnoreCaseAscii("Helv"))
    1401             :         {
    1402           0 :              aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Helvetica" ));
    1403           0 :             if (eFamily==FAMILY_DONTKNOW)
    1404           0 :                 eFamily = FAMILY_SWISS;
    1405             :         }
    1406           0 :         else if (aName.EqualsIgnoreCaseAscii("Tms Rmn"))
    1407             :         {
    1408           0 :              aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Times New Roman" ));
    1409           0 :             if (eFamily==FAMILY_DONTKNOW)
    1410           0 :                 eFamily = FAMILY_ROMAN;
    1411             :         }
    1412           0 :         else if (aName.EqualsIgnoreCaseAscii("System Monospaced") )
    1413             :         {
    1414           0 :              aName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Courier" ));
    1415           0 :             ePitch = PITCH_FIXED;
    1416             :         }
    1417             :     }
    1418             : // nun koennen wir den font basteln: .........................
    1419           0 :     return SvxFontItem(eFamily, aName, aEmptyStr, ePitch, eCharSet, RES_CHRATR_FONT);
    1420             : }
    1421             : 
    1422             : /////////////////////////////////////////////////////////////////// Dop
    1423           0 : void Ww1Dop::Out(Ww1Shell& rOut)
    1424             : {
    1425             :     //~ mdt: fehlt
    1426           0 :     long nDefTabSiz = aDop.dxaTabGet();
    1427           0 :     if (nDefTabSiz < 56)
    1428           0 :         nDefTabSiz = 709;
    1429             : 
    1430             :     // wir wollen genau einen DefaultTab
    1431           0 :     SvxTabStopItem aNewTab(1, sal_uInt16(nDefTabSiz), SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP);
    1432           0 :     ((SvxTabStop&)aNewTab[0]).GetAdjustment() = SVX_TAB_ADJUST_DEFAULT;
    1433           0 :     rOut.GetDoc().GetAttrPool().SetPoolDefaultItem( aNewTab); //~ mdt: besser (GetDoc)
    1434             : 
    1435           0 :     SwFrmFmt &rFmt = rOut.GetPageDesc().GetMaster();
    1436           0 :     W1_DOP& rDOP = GetDOP();
    1437           0 :     rOut.GetPageDesc().SetLandscape(rDOP.fWideGet());
    1438           0 :     SwFmtFrmSize aSz(rFmt.GetFrmSize());
    1439           0 :     aSz.SetWidth(rDOP.xaPageGet());
    1440           0 :     aSz.SetHeight(rDOP.yaPageGet());
    1441           0 :     rFmt.SetFmtAttr(aSz);
    1442           0 :     SvxLRSpaceItem aLR(rDOP.dxaLeftGet()+rDOP.dxaGutterGet(),
    1443           0 :      rDOP.dxaRightGet(), 0, 0, RES_LR_SPACE);
    1444           0 :     rFmt.SetFmtAttr(aLR);
    1445           0 :     SvxULSpaceItem aUL(rDOP.dyaTopGet(), rDOP.dyaBottomGet(), RES_UL_SPACE);
    1446           0 :     rFmt.SetFmtAttr(aUL);
    1447             : 
    1448           0 :     SwFtnInfo aInfo;
    1449           0 :     aInfo = rOut.GetDoc().GetFtnInfo();     // Copy-Ctor privat
    1450             :                 // wo positioniert ? ( 0 == Section, 1 == Page,
    1451             :                 // 2 == beim Text -> Page, 3 == Doc  )
    1452           0 :     switch( rDOP.fpcGet() ){
    1453             :     case 1:
    1454           0 :     case 2: aInfo.ePos = FTNPOS_PAGE; break;
    1455           0 :     default: aInfo.ePos = FTNPOS_CHAPTER; break;
    1456             :     }
    1457             :     // Da Sw unter Chapter anscheinend was anderes versteht als PMW
    1458             :     // hier also immer Doc !
    1459           0 :     aInfo.eNum = FTNNUM_DOC;
    1460             :                             // wie neu nummerieren ?
    1461             :                             // SW-UI erlaubt Nummer nur bei FTNNUM_DOC
    1462           0 :     if( rDOP.nFtnGet() > 0 && aInfo.eNum == FTNNUM_DOC )
    1463           0 :         aInfo.nFtnOffset = rDOP.nFtnGet() - 1;
    1464           0 :     rOut.GetDoc().SetFtnInfo( aInfo );
    1465             : 
    1466           0 : }
    1467             : 
    1468             : ///////////////////////////////////////////////////////////////// Assoc
    1469           0 : void Ww1Assoc::Out(Ww1Shell& rOut)
    1470             : {
    1471             : //~ mdt: fehlen: FileNext, Dot, DataDoc, HeaderDoc, Criteria1,
    1472             : // Criteria2, Criteria3, Criteria4, Criteria5, Criteria6, Criteria7
    1473           0 :     SwDocShell *pDocShell(rOut.GetDoc().GetDocShell());
    1474             :     OSL_ENSURE(pDocShell, "no SwDocShell");
    1475           0 :     if (pDocShell) {
    1476             :         uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
    1477           0 :             pDocShell->GetModel(), uno::UNO_QUERY_THROW);
    1478             :         uno::Reference<document::XDocumentProperties> xDocProps(
    1479           0 :             xDPS->getDocumentProperties());
    1480             :         OSL_ENSURE(xDocProps.is(), "DocumentProperties is null");
    1481           0 :         if (xDocProps.is()) {
    1482           0 :             xDocProps->setTitle( GetStr(Title) );
    1483           0 :             xDocProps->setSubject( GetStr(Subject) );
    1484           0 :             xDocProps->setDescription( GetStr(Comments) );
    1485           0 :             xDocProps->setKeywords(
    1486           0 :               ::comphelper::string::convertCommaSeparated( GetStr(KeyWords) ) );
    1487           0 :             xDocProps->setAuthor( GetStr(Author) );
    1488           0 :             xDocProps->setModifiedBy( GetStr(LastRevBy) );
    1489           0 :         }
    1490             :     }
    1491           0 : }
    1492             : 
    1493             : //////////////////////////////////////////////////////////// StyleSheet
    1494           0 : void Ww1StyleSheet::OutDefaults(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 stc)
    1495             : {
    1496           0 :     switch (stc){
    1497             :     case 222: // Null
    1498           0 :         rOut << SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE);
    1499           0 :         rOut << SvxFontItem(rMan.GetFont(2));
    1500           0 :         break;
    1501             :     case 223: // annotation reference
    1502           0 :         rOut << SvxFontHeightItem(160, 100, RES_CHRATR_FONTSIZE);
    1503           0 :         break;
    1504             :     case 224: // annotation text
    1505           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1506           0 :         break;
    1507             :     case 225: // table of contents 8
    1508             :     case 226: // table of contents 7
    1509             :     case 227: // table of contents 6
    1510             :     case 228: // table of contents 5
    1511             :     case 229: // table of contents 4
    1512             :     case 230: // table of contents 3
    1513             :     case 231: // table of contents 2
    1514             :     case 232: // table of contents 1
    1515           0 :         rOut << SvxLRSpaceItem(( 232 - stc ) * 720, 720, 0, 0, RES_LR_SPACE);
    1516             :             // Tabulatoren fehlen noch !
    1517           0 :         break;
    1518             :     case 233: // index 7
    1519             :     case 234: // und index 6
    1520             :     case 235: // und index 5
    1521             :     case 236: // und index 4
    1522             :     case 237: // und index 3
    1523             :     case 238: // und index 2
    1524           0 :         rOut << SvxLRSpaceItem(( 239 - stc ) * 360, 0, 0, 0, RES_LR_SPACE);
    1525           0 :         break;
    1526             :     case 239: // index 1
    1527           0 :         break;
    1528             :     case 240: // line number
    1529           0 :         break;
    1530             :     case 241: // index heading
    1531           0 :         break;
    1532             :     case 242:  // footer
    1533             :     case 243:{ // ... und header
    1534           0 :             SvxTabStopItem aAttr(RES_PARATR_TABSTOP);
    1535           0 :             SvxTabStop aTabStop;
    1536           0 :             aTabStop.GetTabPos() = 4535;  // 8 cm
    1537           0 :             aTabStop.GetAdjustment() = SVX_TAB_ADJUST_CENTER;
    1538           0 :             aAttr.Insert( aTabStop );
    1539           0 :             aTabStop.GetTabPos() = 9071;  // 16 cm
    1540           0 :             aTabStop.GetAdjustment() = SVX_TAB_ADJUST_RIGHT;
    1541           0 :             aAttr.Insert( aTabStop );
    1542           0 :             rOut << aAttr;
    1543             :         }
    1544           0 :         break;
    1545             :     case 244: // footnote reference
    1546           0 :         rOut << SvxFontHeightItem(160, 100, RES_CHRATR_FONTSIZE);
    1547           0 :         rOut << SvxEscapementItem(6 * 100 / 24, 100, RES_CHRATR_ESCAPEMENT);
    1548           0 :         break;
    1549             :     case 245: // footnote text
    1550           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1551           0 :         break;
    1552             :     case 246: // heading 9
    1553             :     case 247: // und heading 8
    1554             :     case 248: // und heading 7
    1555           0 :         rOut << SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE);
    1556             :         rOut << SvxPostureItem(
    1557           0 :                     rOut.GetPostureItalic()?ITALIC_NONE:ITALIC_NORMAL, RES_CHRATR_POSTURE);
    1558           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1559           0 :         break;
    1560             :     case 249: // heading 6
    1561           0 :         rOut << SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE);
    1562           0 :         rOut << SvxUnderlineItem(UNDERLINE_SINGLE, RES_CHRATR_UNDERLINE);
    1563           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1564           0 :         break;
    1565             :     case 250: // heading 5
    1566           0 :         rOut << SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE);
    1567           0 :         rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD, RES_CHRATR_WEIGHT);
    1568           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1569           0 :         break;
    1570             :     case 251: // heading 4
    1571           0 :         rOut << SvxLRSpaceItem(360, 0, 0, 0, RES_LR_SPACE);
    1572           0 :         rOut << SvxUnderlineItem(UNDERLINE_SINGLE, RES_CHRATR_UNDERLINE);
    1573           0 :         rOut << SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE);
    1574           0 :         break;
    1575             :     case 252: // heading 3
    1576           0 :         rOut << SvxLRSpaceItem(360, 0, 0, 0, RES_LR_SPACE);
    1577           0 :         rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD, RES_CHRATR_WEIGHT);
    1578           0 :         rOut << SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE);
    1579           0 :         break;
    1580             :     case 253: // heading 2
    1581           0 :         rOut << SvxULSpaceItem(120, 0, RES_UL_SPACE);
    1582           0 :         rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD, RES_CHRATR_WEIGHT);
    1583           0 :         rOut << SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE);
    1584           0 :         rOut << SvxFontItem(rMan.GetFont(2));
    1585           0 :         break;
    1586             :     case 254: // heading 1
    1587           0 :         rOut << SvxULSpaceItem(240, 0, RES_UL_SPACE);
    1588           0 :         rOut << SvxWeightItem(rOut.GetWeightBold()?WEIGHT_NORMAL:WEIGHT_BOLD, RES_CHRATR_WEIGHT);
    1589           0 :         rOut << SvxUnderlineItem(UNDERLINE_SINGLE, RES_CHRATR_UNDERLINE);
    1590           0 :         rOut << SvxFontHeightItem(240, 100, RES_CHRATR_FONTSIZE);
    1591           0 :         rOut << SvxFontItem(rMan.GetFont(2));
    1592           0 :         break;
    1593             :     case 255: // Normal indent
    1594           0 :         rOut << SvxLRSpaceItem(720, 0, 0, 0, RES_LR_SPACE);
    1595           0 :         break;
    1596             :     case 0: // Normal
    1597           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1598           0 :         break;
    1599             :     default: // selbstdefiniert
    1600           0 :         rOut << SvxFontHeightItem(200, 100, RES_CHRATR_FONTSIZE);
    1601           0 :         break;
    1602             :     }
    1603           0 : }
    1604             : 
    1605           0 : void Ww1StyleSheet::OutOne(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 stc)
    1606             : {
    1607           0 :     const RES_POOL_COLLFMT_TYPE RES_NONE = RES_POOLCOLL_DOC_END;
    1608           0 :     RES_POOL_COLLFMT_TYPE aType = RES_NONE;
    1609             : 
    1610           0 :     switch (stc)
    1611             :     {
    1612             :     case 222: // Null
    1613           0 :         aType = RES_POOLCOLL_TEXT; break;   //???
    1614             :     case 223: // annotation reference
    1615           0 :         break;
    1616             :     case 224: // annotation text
    1617           0 :         break;
    1618             :     case 225: // table of contents 8
    1619           0 :         aType = RES_POOLCOLL_TOX_CNTNT8; break;
    1620             :     case 226: // table of contents 7
    1621           0 :         aType = RES_POOLCOLL_TOX_CNTNT7; break;
    1622             :     case 227: // table of contents 6
    1623           0 :         aType = RES_POOLCOLL_TOX_CNTNT6; break;
    1624             :     case 228: // table of contents 5
    1625           0 :         aType = RES_POOLCOLL_TOX_CNTNT5; break;
    1626             :     case 229: // table of contents 4
    1627           0 :         aType = RES_POOLCOLL_TOX_CNTNT4; break;
    1628             :     case 230: // table of contents 3
    1629           0 :         aType = RES_POOLCOLL_TOX_CNTNT3; break;
    1630             :     case 231: // table of contents 2
    1631           0 :         aType = RES_POOLCOLL_TOX_CNTNT2; break;
    1632             :     case 232: // table of contents 1
    1633           0 :         aType = RES_POOLCOLL_TOX_CNTNT1; break;
    1634             :     case 233: // index 7
    1635           0 :         break;
    1636             :     case 234: // index 6
    1637           0 :         break;
    1638             :     case 235: // index 5
    1639           0 :         break;
    1640             :     case 236: // index 4
    1641           0 :         break;
    1642             :     case 237: // index 3
    1643           0 :         aType = RES_POOLCOLL_TOX_IDX3; break;
    1644             :     case 238: // index 2
    1645           0 :         aType = RES_POOLCOLL_TOX_IDX2; break;
    1646             :     case 239: // index 1
    1647           0 :         aType = RES_POOLCOLL_TOX_IDX1; break;
    1648             :     case 240: // line number
    1649           0 :         break;
    1650             :     case 241: // index heading
    1651           0 :         break;
    1652             :     case 242: // footer
    1653           0 :         aType = RES_POOLCOLL_FOOTER; break;
    1654             :     case 243: // header
    1655           0 :         aType = RES_POOLCOLL_HEADER; break;
    1656             :     case 244: // footnote reference
    1657           0 :         break;
    1658             :     case 245: // footnote text
    1659           0 :         aType = RES_POOLCOLL_FOOTNOTE; break;
    1660             :     case 246: // heading 9
    1661           0 :         break;
    1662             :     case 247: // heading 8
    1663           0 :         break;
    1664             :     case 248: // heading 7
    1665           0 :         break;
    1666             :     case 249: // heading 6
    1667           0 :         break;
    1668             :     case 250: // heading 5
    1669           0 :         aType = RES_POOLCOLL_HEADLINE5; break;
    1670             :     case 251: // heading 4
    1671           0 :         aType = RES_POOLCOLL_HEADLINE4; break;
    1672             :     case 252: // heading 3
    1673           0 :         aType = RES_POOLCOLL_HEADLINE3; break;
    1674             :     case 253: // heading 2
    1675           0 :         aType = RES_POOLCOLL_HEADLINE2; break;
    1676             :     case 254: // heading 1
    1677           0 :         aType = RES_POOLCOLL_HEADLINE1; break;
    1678             :     case 255: // Normal indent
    1679           0 :         aType = RES_POOLCOLL_TEXT_IDENT; break;
    1680             :     case 0: // Normal
    1681           0 :         aType = RES_POOLCOLL_STANDARD; break;
    1682             :     }
    1683           0 :     if (aType == RES_NONE)
    1684           0 :         rOut.BeginStyle(stc, GetStyle(stc).GetName() );
    1685             :     else
    1686           0 :         rOut.BeginStyle(stc, aType);
    1687           0 :     OutDefaults(rOut, rMan, stc);
    1688           0 :     GetStyle(stc).Out(rOut, rMan);
    1689           0 :     rOut.EndStyle();
    1690           0 : }
    1691             : // OutOneWithBase() liest einen Style mit OutOne() einen Style ein
    1692             : // Jedoch liest er, wenn noch nicht geschehen, den Basisstyle rekursiv ein
    1693           0 : void Ww1StyleSheet::OutOneWithBase(Ww1Shell& rOut, Ww1Manager& rMan,
    1694             :                                    sal_uInt16 stc, sal_uInt8* pbStopRecur )
    1695             : {
    1696             : // SH: lineares Einlesen ist Scheisse, da dann BasedOn nicht gesetzt
    1697             : // werden kann und ausserdem Toggle- und Modify-Attrs (z.B. Tabs ) nicht gehen.
    1698             : 
    1699           0 :     Ww1Style& rSty = GetStyle(stc);
    1700           0 :     sal_uInt16 nBase = rSty.GetnBase();
    1701           0 :     if( nBase != stc
    1702           0 :         && !rOut.IsStyleImported( nBase )
    1703           0 :         && GetStyle(nBase).IsUsed()
    1704           0 :         && !pbStopRecur[nBase] ){
    1705             : 
    1706           0 :         pbStopRecur[nBase] = 1;
    1707           0 :         OutOneWithBase( rOut, rMan, nBase, pbStopRecur ); // Rekursiv
    1708             :     }
    1709           0 :     OutOne( rOut, rMan, stc );
    1710           0 : }
    1711             : 
    1712           0 : void Ww1StyleSheet::Out(Ww1Shell& rOut, Ww1Manager& rMan)
    1713             : {
    1714             :     sal_uInt16 stc;
    1715             :     sal_uInt8 bStopRecur[256];
    1716           0 :     memset( bStopRecur, sal_False, sizeof(bStopRecur) );
    1717             : 
    1718             : // 1. Durchlauf: Styles mit Basisstyles rekursiv
    1719           0 :     for (stc=0;stc<Count();stc++)
    1720           0 :         if (GetStyle(stc).IsUsed() && !rOut.IsStyleImported( stc ) )
    1721           0 :             OutOneWithBase( rOut, rMan, stc, bStopRecur );
    1722             : 
    1723             : // 2. Durchlauf: Follow-Styles
    1724           0 :     for (stc=0;stc<Count();stc++){
    1725           0 :         Ww1Style& rSty = GetStyle(stc);
    1726           0 :         if ( rSty.IsUsed() ){
    1727           0 :             sal_uInt16 nNext = rSty.GetnNext();
    1728           0 :             if( nNext != stc && GetStyle(nNext).IsUsed() )
    1729           0 :                 rOut.NextStyle( stc, nNext );
    1730             :         }
    1731             :     }
    1732           0 : }
    1733             : 
    1734             : ////////////////////////////////////////////////////////////// Picture
    1735           0 : static sal_uLong GuessPicSize(W1_PIC* pPic)
    1736             : {
    1737           0 :     sal_uInt16 maxx = pPic->mfp.xExtGet();
    1738           0 :     sal_uInt16 padx = ((maxx + 7) / 8) * 8;
    1739           0 :     sal_uInt16 maxy = pPic->mfp.yExtGet();
    1740           0 :     return 120L + (sal_uLong)padx * maxy;
    1741             : }
    1742             : 
    1743             : //
    1744             : // folgende methode schreibt eine windows-.BMP-datei aus einem
    1745             : // embeddeten bild in ww-1 dateien
    1746             : // gelesen wird 4-bit format, geschrieben jedoch 8-bit.
    1747             : //
    1748           0 : void Ww1Picture::WriteBmp(SvStream& rOut)
    1749             : {
    1750           0 :     long nSize = pPic->lcbGet() - (sizeof(*pPic)-sizeof(pPic->rgb));
    1751           0 :     sal_uInt8* p = pPic->rgbGet();
    1752           0 :     sal_uInt16 maxx = pPic->mfp.xExtGet();
    1753           0 :     sal_uInt16 padx = ((maxx + 7) / 8) * 8;
    1754           0 :     sal_uInt16 maxy = pPic->mfp.yExtGet();
    1755             : 
    1756           0 :      p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    1757           0 :      p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    1758             : #if OSL_DEBUG_LEVEL > 0
    1759             :     sal_uInt16 x = SVBT16ToShort(p);
    1760             :     (void) x;
    1761             : #endif
    1762           0 :     p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    1763             : #if OSL_DEBUG_LEVEL > 0
    1764             :     sal_uInt16 y = SVBT16ToShort(p);
    1765             :     (void) y;
    1766             : #endif
    1767           0 :     p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    1768             : #if OSL_DEBUG_LEVEL > 0
    1769             :     sal_uInt16 planes = SVBT16ToShort(p);
    1770             :     (void) planes;
    1771             : #endif
    1772           0 :     p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    1773             : #if OSL_DEBUG_LEVEL > 0
    1774             :     sal_uInt16 bitcount = SVBT16ToShort(p);
    1775             :     (void) bitcount;
    1776             : #endif
    1777           0 :     p+= sizeof(SVBT16); nSize -= sizeof(SVBT16);
    1778             : 
    1779             : #if OSL_DEBUG_LEVEL > 0
    1780             :     OSL_ENSURE(x==maxx, "Ww1Picture");
    1781             :     OSL_ENSURE(y==maxy, "Ww1Picture");
    1782             :     OSL_ENSURE(planes==1, "Ww1Picture");
    1783             :     OSL_ENSURE(bitcount==4, "Ww1Picture");
    1784             : #endif
    1785             : 
    1786             :     OSL_ENSURE(16*3+padx*maxy/2==nSize, "Ww1Picture");
    1787             : 
    1788             :     SVBT32 tmpLong;
    1789             :     SVBT16 tmpShort;
    1790             :     SVBT8 tmpByte;
    1791             : #define wLong(n) \
    1792             :     UInt32ToSVBT32(n, tmpLong); \
    1793             :     if ((rOut.Write(tmpLong, sizeof(SVBT32))) != sizeof(SVBT32)) goto error;
    1794             : #define wShort(n) \
    1795             :     ShortToSVBT16(n, tmpShort); \
    1796             :     if ((rOut.Write(tmpShort, sizeof(SVBT16))) != sizeof(SVBT16)) goto error;
    1797             : #define wByte(n) \
    1798             :     ByteToSVBT8(n, tmpByte); \
    1799             :     if ((rOut.Write(tmpByte, sizeof(SVBT8))) != sizeof(SVBT8)) goto error;
    1800           0 :     wByte('B'); wByte('M');
    1801           0 :     wLong(54 + 4 * 16 + padx * maxy);
    1802           0 :     wLong(0);
    1803           0 :     wLong(54 + 4 * 16);
    1804           0 :     wLong(40);
    1805           0 :     wLong(maxx);
    1806           0 :     wLong(maxy);
    1807           0 :     wShort(1);
    1808           0 :     wShort(8);
    1809           0 :     wLong(0);
    1810           0 :     wLong(0);
    1811           0 :     wLong(0);
    1812           0 :     wLong(0);
    1813           0 :     wLong(16);
    1814           0 :     wLong(16);
    1815             :     sal_uInt16 i;
    1816           0 :     for (i=0;nSize>0&&i<16;i++)
    1817             :     {
    1818           0 :         wByte(*p);
    1819           0 :         p++;
    1820           0 :         nSize -= sizeof(sal_uInt8);
    1821           0 :         wByte(*p);
    1822           0 :         p++;
    1823           0 :         nSize -= sizeof(sal_uInt8);
    1824           0 :         wByte(*p);
    1825           0 :         p++;
    1826           0 :         nSize -= sizeof(sal_uInt8);
    1827           0 :         wByte(0);
    1828             :     }
    1829             :     OSL_ENSURE(padx*maxy/2==nSize, "Ww1Picture");
    1830             :     sal_uInt16 j;
    1831             :     {
    1832           0 :         sal_uInt8* pBuf = new sal_uInt8[padx];
    1833           0 :         for (j=0;nSize>0&&j<maxy;j++)
    1834             :         {
    1835           0 :             sal_uInt8* q = pBuf;
    1836           0 :             for (i=0;nSize>0&&i<maxx;i+=2)
    1837             :             {
    1838           0 :                 *q++ = *p>>4;
    1839           0 :                 *q++ = *p&0xf;
    1840           0 :                 p++;
    1841           0 :                 nSize -= sizeof(sal_uInt8);
    1842             :             }
    1843           0 :             for (;i<padx;i+=2)
    1844             :             {
    1845           0 :                 *q++ = 0;
    1846           0 :                 p++;
    1847           0 :                 nSize -= sizeof(sal_uInt8);
    1848             :             }
    1849           0 :             if(rOut.Write(pBuf, padx) != padx){
    1850           0 :                 delete [] pBuf;
    1851           0 :                 goto error;
    1852             :             }
    1853             :         }
    1854           0 :         delete [] pBuf;
    1855             :     }
    1856             :     OSL_ENSURE(nSize==0, "Ww1Picture");
    1857             : #undef wLong
    1858             : #undef wShort
    1859             : #undef wByte
    1860           0 :     rOut.Seek(0);
    1861           0 :     return;
    1862             : error:
    1863             :     ;
    1864             : }
    1865             : 
    1866           0 : void Ww1Picture::Out(Ww1Shell& rOut, Ww1Manager& /*rMan*/)
    1867             : {
    1868           0 :     Graphic* pGraphic = 0;
    1869             :     sal_uInt16 mm;
    1870           0 :     switch (mm = pPic->mfp.mmGet())
    1871             :     {
    1872             :     case 8: // embedded metafile
    1873             :     {
    1874           0 :         SvMemoryStream aOut(8192, 8192);
    1875           0 :         aOut.Write(pPic->rgbGet(), pPic->lcbGet() -
    1876           0 :          (sizeof(*pPic)-sizeof(pPic->rgb)));
    1877           0 :         aOut.Seek(0);
    1878           0 :         GDIMetaFile aWMF;
    1879           0 :         if (ReadWindowMetafile( aOut, aWMF, NULL ) && aWMF.GetActionSize() > 0)
    1880             :         {
    1881           0 :             aWMF.SetPrefMapMode(MapMode(MAP_100TH_MM));
    1882           0 :             Size aOldSiz(aWMF.GetPrefSize());
    1883           0 :             Size aNewSiz(pPic->mfp.xExtGet(), pPic->mfp.yExtGet());
    1884           0 :             Fraction aFracX(aNewSiz.Width(), aOldSiz.Width());
    1885           0 :             Fraction aFracY(aNewSiz.Height(), aOldSiz.Height());
    1886           0 :             aWMF.Scale(aFracX, aFracY);
    1887           0 :             aWMF.SetPrefSize(aNewSiz);
    1888           0 :             pGraphic = new Graphic(aWMF);
    1889             :         }
    1890           0 :         break;
    1891             :     }
    1892             :     case 94: // embedded name SH:??? Was denn nun ? Embeddet oder Name ?
    1893             :     case 98: // TIFF-Name
    1894             :     {
    1895           0 :         String aDir( (sal_Char*)pPic->rgbGet(),
    1896           0 :                 (sal_uInt16)(pPic->lcbGet() - (sizeof(*pPic)-sizeof(pPic->rgb))),
    1897           0 :                 RTL_TEXTENCODING_MS_1252 );
    1898             : 
    1899           0 :         rOut.AddGraphic( aDir );
    1900             :     }
    1901           0 :     break;
    1902             :     case 97: // embedded bitmap
    1903             :     {
    1904           0 :         sal_uLong nSiz = GuessPicSize(pPic);
    1905           0 :         SvMemoryStream aOut(nSiz, 8192);
    1906           0 :         WriteBmp(aOut);
    1907           0 :         Bitmap aBmp;
    1908           0 :         ReadDIB(aBmp, aOut, true);
    1909           0 :         pGraphic = new Graphic(aBmp);
    1910             :     }
    1911             :     default:
    1912             :         OSL_ENSURE(pPic->mfp.mmGet() == 97, "Ww1Picture");
    1913             :     }
    1914           0 :     if (pGraphic)
    1915           0 :         rOut << *pGraphic;
    1916           0 : }
    1917             : 
    1918             : ////////////////////////////////////////////////////////// HeaderFooter
    1919           0 : void Ww1HeaderFooter::Start(Ww1Shell& rOut, Ww1Manager& rMan)
    1920             : {
    1921             : // wird sowieso nur bei SEPs aufgerufen, keine weitere pruefung
    1922             : // noetig:
    1923           0 :     if (!rMan.Pushed())
    1924             :     {
    1925           0 :         while (++(*this))
    1926           0 :             switch (eHeaderFooterMode)
    1927             :             {
    1928             :             case FtnSep:
    1929           0 :             break;
    1930             :             case FtnFollowSep:
    1931           0 :             break;
    1932             :             case FtnNote:
    1933           0 :             break;
    1934             :             case EvenHeadL:
    1935           0 :             break;
    1936             :             case OddHeadL:
    1937             :             {
    1938           0 :                 sal_uLong begin = 0;
    1939           0 :                 sal_uLong end = 0;
    1940           0 :                 if (FillOddHeadL(begin, end))
    1941             :                 {
    1942           0 :                     Ww1HddText* pText = new Ww1HddText(rMan.GetFib());
    1943           0 :                     pText->Seek(begin);
    1944           0 :                     pText->SetCount(end-begin);
    1945           0 :                     rOut.BeginHeader();
    1946           0 :                     rMan.Push1(pText, pText->Offset(rMan.GetFib()), begin,
    1947           0 :                      new Ww1HeaderFooterFields(rMan.GetFib()));
    1948           0 :                     rOut << rMan;
    1949           0 :                     rMan.Pop();
    1950           0 :                     rOut.EndHeaderFooter();
    1951           0 :                     return;
    1952             :                 }
    1953             :             }
    1954           0 :             break;
    1955             :             case EvenFootL:
    1956           0 :             break;
    1957             :             case OddFootL:
    1958             :             {
    1959           0 :                 sal_uLong begin = 0;
    1960           0 :                 sal_uLong end = 0;
    1961           0 :                 if (FillOddFootL(begin, end))
    1962             :                 {
    1963           0 :                     Ww1HddText* pText = new Ww1HddText(rMan.GetFib());
    1964           0 :                     pText->Seek(begin);
    1965           0 :                     pText->SetCount(end-begin);
    1966           0 :                     rOut.BeginFooter();
    1967           0 :                     rMan.Push1(pText, pText->Offset(rMan.GetFib()), begin,
    1968           0 :                      new Ww1HeaderFooterFields(rMan.GetFib()));
    1969           0 :                     rOut << rMan;
    1970           0 :                     rMan.Pop();
    1971           0 :                     rOut.EndHeaderFooter();
    1972           0 :                     return;
    1973             :                 }
    1974             :             }
    1975           0 :             break;
    1976             :             case FirstHeadL:
    1977           0 :             break;
    1978             :             default:
    1979           0 :             break;
    1980             :             }
    1981             :     }
    1982             : }
    1983             : 
    1984           0 : void Ww1HeaderFooter::Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode&)
    1985             : {
    1986           0 :     if (!rMan.Pushed() && eHeaderFooterMode != None)
    1987             :     {
    1988           0 :         Start(rOut, rMan);
    1989             :     }
    1990          99 : }
    1991             : 
    1992             : 
    1993             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10