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

Generated by: LCOV version 1.10